Compare commits

..

10 Commits

Author SHA1 Message Date
Preston 962bebab6c Adjusted the distance check for players in player's path, effectively making the collision area of players larger. This can be changed in Bounds PlayerCollisionPoint method by increasing or decreasing the minDistance var. 2024-09-24 21:36:12 -05:00
Preston a67fee76c3 Redone player collision by removing all refrences and usage of Bounds in PlayerCharacter.java. Added a new method PlayerCollisionPoint in Bounds.java mirroring PlayerBuildingCollisionPoint for other players instead of buildings. Added a new check in movement mirrioring the check for buildings but for players to ensure that PlayerCollisionPoint is called in each movement. 2024-09-23 23:43:48 -05:00
Preston Driver d22ff916bf Merge branch 'playercollision-1' of http://repo.magicbane.com/Preston/prestonbane into playercollision-1 2024-09-20 12:39:25 -05:00
Preston Driver 2d1da7679e Added functionality to handlePlayerCollision method in PlayerCharacter.java to actively prevent players from standing in each other. 2024-09-20 12:38:37 -05:00
Preston Driver 549a381174 Updated .gitignore. 2024-09-18 22:55:36 -05:00
Preston Driver 43563aeb14 Updated dependencies since it appears that old build failed to. 2024-09-18 22:50:18 -05:00
Preston Driver 7a4c2fe72a Attempt to push to docker container. 2024-09-17 20:52:47 -05:00
Preston Driver 24cc6af147 Added player collision with other players in PlayerCharacter class. 2024-09-16 23:06:07 -05:00
MagicBot 3649c629b7 Revert "DamageType defined as in JSON"
This reverts commit 1c31070fc8.
2024-04-01 12:04:12 -04:00
MagicBot 1c31070fc8 DamageType defined as in JSON 2024-04-01 12:01:59 -04:00
27 changed files with 172 additions and 363 deletions
+5
View File
@@ -24,3 +24,8 @@
hs_err_pid* hs_err_pid*
replay_pid* replay_pid*
*.idea/
Server.iml
*.gitignore
prestonbane.iml
qodana.yaml
+2 -2
View File
@@ -2307,8 +2307,8 @@ public class Enum {
public enum CityBoundsType { public enum CityBoundsType {
GRID(640), GRID(640),
ZONE(675), ZONE(875),
PLACEMENT(677); PLACEMENT(876);
public final float extents; public final float extents;
@@ -19,19 +19,15 @@ import engine.net.AbstractNetMsg;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.ClientConnectionManager;
import engine.net.client.msg.LoadCharacterMsg; import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg; import engine.net.client.msg.LoadStructureMsg;
import engine.net.client.msg.MoveToPointMsg; import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.UnloadObjectsMsg; import engine.net.client.msg.UnloadObjectsMsg;
import engine.net.client.msg.login.CharSelectScreenMsg;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.session.Session;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import static engine.math.FastMath.sqr; import static engine.math.FastMath.sqr;
@@ -217,9 +213,6 @@ public enum InterestManager implements Runnable {
if (!playerCharacter.isEnteredWorld()) if (!playerCharacter.isEnteredWorld())
continue; continue;
if(playerCharacter.level < 10)
playerCharacter.setLevel((short)10);
if (playerCharacter.getTeleportLock().readLock().tryLock()) { if (playerCharacter.getTeleportLock().readLock().tryLock()) {
try { try {
@@ -526,29 +519,12 @@ public enum InterestManager implements Runnable {
if (origin == null) if (origin == null)
return; return;
int currentConnections = 0;
for(PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()){
if(pc.isActive() && pc.isEnteredWorld() && pc.getClientConnection().machineID.equals(player.getClientConnection().machineID)){
currentConnections++;
}
}
try {
if (currentConnections >= 3) {
Session s = SessionManager.getSession(player);
if (s.getAccount() != null) {
CharSelectScreenMsg cssm = new CharSelectScreenMsg(s, false);
s.getConn().sendMsg(cssm);
}
}
}catch(Exception ex){
}
// Update loaded upbjects lists // Update loaded upbjects lists
player.setDirtyLoad(true); player.setDirtyLoad(true);
updateStaticList(player, origin); updateStaticList(player, origin);
updateMobileList(player, origin); updateMobileList(player, origin);
} }
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) { public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
@@ -32,8 +32,6 @@ public class dbCityHandler extends dbHandlerBase {
String type = rs.getString("type"); String type = rs.getString("type");
switch (type) { switch (type) {
case "zone": case "zone":
if(rs.getInt("isPlayerCity") == 0 && Zone.skipZone(rs.getString("Name")))
break;
Zone zone = new Zone(rs); Zone zone = new Zone(rs);
DbManager.addToCache(zone); DbManager.addToCache(zone);
list.add(zone); list.add(zone);
+2 -3
View File
@@ -520,10 +520,9 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0) if (building.getBlueprintUUID() == 0)
return false; return false;
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) { if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
Logger.error("failed at addHireling with contract: " + contract.getContractID());
return false; return false;
}
String pirateName = NPCManager.getPirateName(contract.getMobbaseID()); String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
if (item.getChargesRemaining() > 0) if (item.getChargesRemaining() > 0)
+1 -1
View File
@@ -180,7 +180,7 @@ public enum DevCmdManager {
//kill any commands not available to everyone on production server //kill any commands not available to everyone on production server
//only admin level can run dev commands on production //only admin level can run dev commands on production
if (a.status.equals(Enum.AccountStatus.ADMIN) == false && a.getUname().toLowerCase().equals("fatboy") == false && a.getUname().toLowerCase().equals("sinmara#1") == false) { if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd); Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false; return false;
} }
+7 -75
View File
@@ -17,7 +17,6 @@ import engine.objects.*;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -35,13 +34,6 @@ public enum LootManager {
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>(); public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>(); public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
public static ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510}));
public static ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27570,188900,188910,188920,188930,188940,188950,189500}));
public static ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27550,27560,189100,189110,189120,189130,189140,189150}));
public static ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(new Integer[]{27600,188700,188720,189550,189560}));
public static ArrayList<Integer> racial_stewards = new ArrayList<>(Arrays.asList(new Integer[]{974,1064,1172,1267,1368,1468,1520,1528,1553,1578,1617,1667,1712}));
public static ArrayList<Integer> undead_guards = new ArrayList<>(Arrays.asList(new Integer[]{980100,980101,980102,980110,980111}));
// Drop Rates // Drop Rates
public static float NORMAL_DROP_RATE; public static float NORMAL_DROP_RATE;
@@ -76,30 +68,6 @@ public enum LootManager {
public static void GenerateMobLoot(Mob mob) { public static void GenerateMobLoot(Mob mob) {
if(mob == null)
return;
if(mob.level == 85){
MobLoot mithril = new MobLoot(mob, ItemBase.getItemBase(1580021), 1, true);
mob.getCharItemManager().addItemToInventory(mithril);
try{
int stewardRoll = ThreadLocalRandom.current().nextInt(1,racial_stewards.size() + 1);
MobLoot steward = new MobLoot(mob, ItemBase.getItemBase((Integer) racial_stewards.toArray()[stewardRoll]), true);
mob.getCharItemManager().addItemToInventory(steward);
}catch(Exception ex){
}
try{
int guardRoll = ThreadLocalRandom.current().nextInt(1,undead_guards.size() + 1);
MobLoot guard = new MobLoot(mob, ItemBase.getItemBase((Integer) undead_guards.toArray()[guardRoll]), true);
mob.getCharItemManager().addItemToInventory(guard);
}catch(Exception ex){
}
return;
}
//determine if mob is in hotzone //determine if mob is in hotzone
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc()); boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
@@ -117,13 +85,7 @@ public enum LootManager {
ItemBase ib = it.getItemBase(); ItemBase ib = it.getItemBase();
if(ib == null) if(ib == null)
break; break;
if (ib.getName().toLowerCase().contains("of the gods")) { if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
}
if(ib.isDiscRune()){
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?"); ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10); chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
@@ -167,7 +129,7 @@ public enum LootManager {
break; break;
case "ITEM": case "ITEM":
GenerateInventoryDrop(mob, bse, inHotzone); GenerateInventoryDrop(mob, bse);
break; break;
} }
} }
@@ -209,7 +171,7 @@ public enum LootManager {
if (itemUUID == 0) if (itemUUID == 0)
return null; return null;
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal() && itemUUID != 1580021) { if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1); int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false); return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
} }
@@ -234,9 +196,6 @@ public enum LootManager {
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName()); Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
} }
} }
if(outItem.getName().toLowerCase().contains("of the gods") && inHotzone == false)
return null;
return outItem; return outItem;
} }
@@ -384,24 +343,8 @@ public enum LootManager {
if (equipmentRoll > dropChance) if (equipmentRoll > dropChance)
continue; continue;
ItemBase genericIB = me.getItemBase();
//if(genericIB.isVorg()){ MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
if(vorg_cloth_uuids.contains(genericIB.getUUID())){
//get random cloth piece
genericIB = ItemBase.getItemBase(vorg_cloth_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_cloth_uuids.size() - 1)));
} else if(vorg_ha_uuids.contains(genericIB.getUUID())){
//get random heavy armor piece
genericIB = ItemBase.getItemBase(vorg_ha_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ha_uuids.size() - 1)));
} else if(vorg_ma_uuids.contains(genericIB.getUUID())){
//get random medium armor piece
genericIB = ItemBase.getItemBase(vorg_ma_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ma_uuids.size() - 1)));
} else if(vorg_la_uuids.contains(genericIB.getUUID())){
//get random light armor piece
genericIB = ItemBase.getItemBase(vorg_la_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_la_uuids.size() - 1)));
}
mob.spawnTime = ThreadLocalRandom.current().nextInt(300,2700);
//}
MobLoot ml = new MobLoot(mob, genericIB, false);
if (ml != null && dropCount < 1) { if (ml != null && dropCount < 1) {
ml.setIsID(true); ml.setIsID(true);
@@ -413,7 +356,7 @@ public enum LootManager {
} }
} }
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse, boolean inHotzone) { public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1); int chanceRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
@@ -422,23 +365,12 @@ public enum LootManager {
if (chanceRoll > bse.dropChance) if (chanceRoll > bse.dropChance)
return; return;
ItemBase ib = ItemBase.getItemBase(bse.itemBase);
if (ib == null)
return;
if (ib.isDiscRune()) {
ItemBase newDisc = ItemBase.getItemBase(ThreadLocalRandom.current().nextInt(3001, 3049 + 1));
if (newDisc != null) {
//mob.getInventory().add(new MobLoot(mob, newDisc, true));
mob.getCharItemManager().addItemToInventory(new MobLoot(mob, newDisc, true));
return;
}
}
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true); MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
if (lootItem != null) if (lootItem != null)
mob.getCharItemManager().addItemToInventory(lootItem); mob.getCharItemManager().addItemToInventory(lootItem);
} }
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) { public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
//get table ID for the itembase ID //get table ID for the itembase ID
@@ -216,6 +216,16 @@ public enum MovementManager {
} }
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
Vector3fImmutable playerCollidePoint = Bounds.PlayerCollisionPoint((PlayerCharacter) toMove, toMove.getLoc(), endLocation);
if (playerCollidePoint != null) {
msg.setEndCoord(playerCollidePoint);
endLocation = playerCollidePoint;
collide = true;
}
}
if (toMove.getObjectType() == GameObjectType.PlayerCharacter && ((PlayerCharacter) toMove).isTeleportMode()) { if (toMove.getObjectType() == GameObjectType.PlayerCharacter && ((PlayerCharacter) toMove).isTeleportMode()) {
toMove.teleport(endLocation); toMove.teleport(endLocation);
return; return;
+40 -1
View File
@@ -81,7 +81,7 @@ public class Bounds {
Bounds identityBounds = Bounds.borrow(); Bounds identityBounds = Bounds.borrow();
identityBounds.setBounds(location); identityBounds.setBounds(location);
collisionState = collide(targetBounds, identityBounds, 0.0f); collisionState = collide(targetBounds, identityBounds, 0.1f);
identityBounds.release(); identityBounds.release();
return collisionState; return collisionState;
} }
@@ -267,6 +267,45 @@ public class Bounds {
return collidePoint; return collidePoint;
} }
public static Vector3fImmutable PlayerCollisionPoint(PlayerCharacter player, Vector3fImmutable start, Vector3fImmutable end) {
Vector3fImmutable collidePoint = null;
float distance = player.getLoc().distance2D(end);
// Check for building collisions first
collidePoint = PlayerBuildingCollisionPoint(player, start, end);
if (collidePoint != null) {
return collidePoint;
}
// Now check for player collisions
HashSet<AbstractWorldObject> nearbyPlayers = WorldGrid.getObjectsInRangePartial(player, distance + 2, MBServerStatics.MASK_PLAYER);
float minDistance = 5.0f; // Minimum distance between players
for (AbstractWorldObject awo : nearbyPlayers) {
PlayerCharacter otherPlayer = (PlayerCharacter) awo;
if (otherPlayer == player) continue;
Vector3fImmutable otherLoc = otherPlayer.getLoc();
Vector3fImmutable closestPoint = getClosestPointOnLine(start, end, otherLoc);
if (closestPoint.distance2D(otherLoc) < minDistance) {
// Collision detected, adjust end point
Vector3fImmutable pushVector = closestPoint.subtract(otherLoc).normalize();
collidePoint = closestPoint.add(pushVector.scaleAdd(minDistance, Vector3fImmutable.ZERO));
break;
}
}
return collidePoint != null ? collidePoint : end;
}
private static Vector3fImmutable getClosestPointOnLine(Vector3fImmutable lineStart, Vector3fImmutable lineEnd, Vector3fImmutable point) {
Vector3fImmutable line = lineEnd.subtract(lineStart);
float t = point.subtract(lineStart).dot(line) / line.dot(line);
t = Math.max(0, Math.min(1, t));
return lineStart.add(line.scaleAdd(t, Vector3fImmutable.ZERO));
}
public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { public static boolean linesTouching(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) {
float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3)); float denominator = ((x2 - x1) * (y4 - y3)) - ((y2 - y1) * (x4 - x3));
float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3)); float numerator1 = ((y1 - y3) * (x4 - x3)) - ((x1 - x3) * (y4 - y3));
+4 -13
View File
@@ -874,7 +874,7 @@ public class MobAI {
} }
} }
} }
} else if (System.currentTimeMillis() > aiAgent.deathTime + (aiAgent.spawnTime * 1000)) { } else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
if (Zone.respawnQue.contains(aiAgent) == false) { if (Zone.respawnQue.contains(aiAgent) == false) {
Zone.respawnQue.add(aiAgent); Zone.respawnQue.add(aiAgent);
@@ -1030,10 +1030,7 @@ public class MobAI {
} }
public static void GuardCaptainLogic(Mob mob) { public static void GuardCaptainLogic(Mob mob) {
if(mob.guardedCity.getBane() == null){
CheckMobMovement(mob);
return;
}
try { try {
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
@@ -1057,10 +1054,7 @@ public class MobAI {
} }
public static void GuardMinionLogic(Mob mob) { public static void GuardMinionLogic(Mob mob) {
if(mob.guardedCity.getBane() == null){
CheckMobMovement(mob);
return;
}
try { try {
boolean isComanded = mob.npcOwner.isAlive(); boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) { if (!isComanded) {
@@ -1080,10 +1074,7 @@ public class MobAI {
} }
public static void GuardWallArcherLogic(Mob mob) { public static void GuardWallArcherLogic(Mob mob) {
if(mob.guardedCity.getBane() == null){
CheckMobMovement(mob);
return;
}
try { try {
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
@@ -562,9 +562,6 @@ public class ClientMessagePump implements NetMsgHandler {
if (i.isCanDestroy()) if (i.isCanDestroy())
if (itemManager.delete(i) == true) { if (itemManager.delete(i) == true) {
int value = i.getItemBase().getBaseValue();
sourcePlayer.getCharItemManager().addGoldToInventory(value,false);
sourcePlayer.getCharItemManager().updateInventory();
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg); Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} }
@@ -57,21 +57,6 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
if (contract.canSlotinBuilding(building)) if (contract.canSlotinBuilding(building))
ItemLists.add(hirelings); ItemLists.add(hirelings);
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)){
if(contract.getContractID() == 899)//alchemist
ItemLists.add(hirelings);
if(contract.getContractID() == 866)//banker
ItemLists.add(hirelings);
if(contract.getContractID() == 865)//siege engineer
ItemLists.add(hirelings);
}
if(building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)){
if(contract.getContractID() == 865)//siege engineer
ItemLists.add(hirelings);
}
} }
} }
@@ -93,20 +78,13 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
return false; return false;
} }
if (building.getBlueprint().getSlotsForRank(building.getRank()) == building.getHirelings().size()) if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
return false; return false;
Item contractItem = Item.getFromCache(msg.getContractItem()); Item contractItem = Item.getFromCache(msg.getContractItem());
if (contractItem == null) if (contractItem == null)
return false; return false;
if (msg.getContractItem() == 850) {//runemaster
for (AbstractCharacter abs : building.getHirelings().keySet()) {
NPC npc = (NPC) abs;
if (npc.contract.getContractID() == 850)
return false; //can only have 1 runemaster
}
}
if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) { if (!player.getCharItemManager().doesCharOwnThisItem(contractItem.getObjectUUID())) {
Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!"); Logger.error(player.getName() + "has attempted to place Hireling : " + contractItem.getName() + "without a valid contract!");
@@ -126,29 +104,10 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
return false; return false;
// Check if contract can be slotted in this building // Check if contract can be slotted in this building
//Logger.error("inserting contract: " + contract.getContractID());
if (contract.canSlotinBuilding(building) == false) {
boolean override = false;
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL)) {
if (contract.getContractID() == 899)//alchemist
override = true;
if (contract.getContractID() == 866)//banker if (contract.canSlotinBuilding(building) == false)
override = true;
if (contract.getContractID() == 865)//siege engineer
override = true;
}
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.SIEGETENT)) {
if (contract.getContractID() == 865)//siege engineer
override = true;
}
if(override == false) {
Logger.error("failed at override with contract: " + contract.getContractID());
return false; return false;
}
}
//Logger.error("override successful: " + contract.getContractID());
if (!BuildingManager.addHireling(building, player, zone, contract, contractItem)) if (!BuildingManager.addHireling(building, player, zone, contract, contractItem))
return false; return false;
@@ -294,7 +294,7 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
// Owner is obviously allowed to upgrade his own buildings // Owner is obviously allowed to upgrade his own buildings
if (building.getOwner() != null && building.getOwner().equals(player)) { if (building.getOwner().equals(player)) {
// Players cannot destroy or transfer a TOL. // Players cannot destroy or transfer a TOL.
@@ -15,7 +15,6 @@ import engine.net.client.msg.*;
import engine.objects.*; import engine.objects.*;
import engine.powers.PowersBase; import engine.powers.PowersBase;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.joda.time.DateTime;
import java.util.ArrayList; import java.util.ArrayList;
@@ -99,10 +98,6 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
private static void requestHermitBlessing(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) { private static void requestHermitBlessing(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
if(DateTime.now().getHourOfDay() < 18 || DateTime.now().getHourOfDay() > 21){
ChatManager.chatSystemInfo(player, "Blessing can only be received between 6:00 pm and 10:00 pm");
}
Guild guild; Guild guild;
Realm realm; Realm realm;
City city; City city;
@@ -123,11 +123,6 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
if (resourceValue < 15) if (resourceValue < 15)
hasResources = false; hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.mithrilIB);
if (resourceValue < 1)
hasResources = false;
if (hasResources == false) { if (hasResources == false) {
ErrorPopupMsg.sendErrorPopup(player, 184); // Insufficient gold or resources to upgrade to capital ErrorPopupMsg.sendErrorPopup(player, 184); // Insufficient gold or resources to upgrade to capital
return false; return false;
@@ -185,16 +180,6 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
return false; return false;
} }
resourceValue = warehouse.getResources().get(Warehouse.mithrilIB);
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 1) == true) {
warehouse.getResources().put(Warehouse.mithrilIB, resourceValue - 1);
warehouse.AddTransactionToWarehouse(engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.MITHRIL, 1);
} else {
Logger.error("wormwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return false;
}
realm.claimRealmForCity(city, charterUUID); realm.claimRealmForCity(city, charterUUID);
tol.setRank(8); tol.setRank(8);
@@ -212,6 +212,10 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
return; return;
} }
for (AbstractCharacter guard : building.getHirelings().keySet()) {
if (guard.getObjectType() == GameObjectType.Mob)
((Mob) guard).setPatrolPointIndex(0);
}
} else if (building.getPatrolPoints() != null) } else if (building.getPatrolPoints() != null)
ClearPatrolPoints(building.getObjectUUID()); ClearPatrolPoints(building.getObjectUUID());
@@ -219,6 +223,10 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints()); AddSentryPoints(building.getObjectUUID(), orderNpcMsg.getSentryPoints());
} else if (building.getSentryPoints() != null) } else if (building.getSentryPoints() != null)
ClearSentryPoints(building.getObjectUUID()); ClearSentryPoints(building.getObjectUUID());
// Dispatch dispatch = Dispatch.borrow(pc, msg);
// DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} }
private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) { private static void processUpgradeNPC(PlayerCharacter player, AbstractCharacter abstractCharacter) {
@@ -533,7 +541,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
} else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) { } else if (orderNPCMsg.getObjectType() == GameObjectType.Mob.ordinal()) {
mob = Mob.getMob(orderNPCMsg.getNpcUUID()); mob = Mob.getFromCacheDBID(orderNPCMsg.getNpcUUID());
if (mob == null) if (mob == null)
return true; return true;
@@ -81,7 +81,6 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
cities = City.getCitiesToTeleportTo(player); cities = City.getCitiesToTeleportTo(player);
else else
cities = City.getCitiesToRepledgeTo(player); cities = City.getCitiesToRepledgeTo(player);
} }
/** /**
+52 -19
View File
@@ -171,7 +171,7 @@ public class Blueprint {
maintCost = (9730 * rank) + 1890; maintCost = (9730 * rank) + 1890;
return maintCost * 2; return maintCost;
} }
public int getMaxRank() { public int getMaxRank() {
@@ -313,10 +313,10 @@ public class Blueprint {
// Early exit for buildings with single or no slots // Early exit for buildings with single or no slots
if (this.maxSlots <= 1 && this.buildingGroup.equals(BuildingGroup.TOL) == false) if (this.maxSlots <= 1)
return maxSlots; return maxSlots;
if (this.maxRank == 1 && currentRank == 1&& this.buildingGroup.equals(BuildingGroup.TOL) == false) if (this.maxRank == 1 && currentRank == 1)
return getMaxSlots(); return getMaxSlots();
switch (currentRank) { switch (currentRank) {
@@ -328,22 +328,20 @@ public class Blueprint {
case 3: case 3:
case 4: case 4:
case 5: case 5:
case 6:
availableSlots = 2; availableSlots = 2;
break; break;
case 6:
case 7: case 7:
availableSlots = 3; availableSlots = 3;
break; break;
case 8: case 8:
availableSlots = 3; availableSlots = 1;
break; break;
default: default:
availableSlots = 0; availableSlots = 0;
break; break;
} }
if(this.buildingGroup.equals(BuildingGroup.TOL)){
availableSlots += 1;
}
return availableSlots; return availableSlots;
} }
@@ -494,19 +492,54 @@ public class Blueprint {
// Select equation for rank time based upon the // Select equation for rank time based upon the
// buildings current Maintenance BuildingGroup. These values // buildings current Maintenance BuildingGroup. These values
// are expressed in hours // are expressed in hours
if(this.getBuildingGroup().equals(BuildingGroup.TOL))
switch(targetRank){ switch (this.buildingGroup) {
case 2:
case 3: case GENERICNOUPGRADE:
case 4: break; // Cannot be upgraded
case 5: case VILLA:
return 6; case ESTATE:
case 6: case FORTRESS:
case 7: case CITADEL:
return 36; rankTime = (7 * targetRank) - 7;
break;
case TOL:
rankTime = (7 * targetRank) - 7;
break;
case BARRACK:
rankTime = (7 * targetRank) - 7;
break;
case CHURCH:
rankTime = (7 * targetRank) - 7;
break;
case FORGE:
case INN:
case TAILOR:
case MAGICSHOP:
rankTime = (7 * targetRank) - 7;
break;
case SPIRE:
rankTime = (4 * targetRank) + 4;
break;
case AMAZONHALL:
case CATHEDRAL:
case GREATHALL:
case KEEP:
case THIEFHALL:
case TEMPLEHALL:
case WIZARDHALL:
case ELVENHALL:
case ELVENSANCTUM:
case IREKEIHALL:
case FORESTHALL:
rankTime = (7 * targetRank) - 7;
break;
default:
Logger.error("Attempt to retrieve ranktime without MaintGroup");
break;
} }
return 5; return rankTime;
} }
public Vector2f getExtents() { public Vector2f getExtents() {
+1 -1
View File
@@ -784,7 +784,7 @@ public class Building extends AbstractWorldObject {
// Add cost for building structure // Add cost for building structure
maintCost += this.getBlueprint().getMaintCost(rank) * 2; maintCost += this.getBlueprint().getMaintCost(rank);
// Add costs associated with hirelings // Add costs associated with hirelings
+16
View File
@@ -75,6 +75,9 @@ public class City extends AbstractWorldObject {
private byte isCapital = 0; private byte isCapital = 0;
private byte isSafeHold; private byte isSafeHold;
private boolean forceRename = false; private boolean forceRename = false;
private boolean noTeleport = false; //used by npc cities
private boolean noRepledge = false; //used by npc cities
private boolean isOpen = false;
private int treeOfLifeID; private int treeOfLifeID;
private Vector3fImmutable location = Vector3fImmutable.ZERO; private Vector3fImmutable location = Vector3fImmutable.ZERO;
@@ -139,6 +142,14 @@ public class City extends AbstractWorldObject {
this.forceRename = rs.getInt("forceRename") == 1; this.forceRename = rs.getInt("forceRename") == 1;
this.open = rs.getInt("open") == 1; this.open = rs.getInt("open") == 1;
if (this.cityName.equals("Perdition") || this.cityName.equals("Bastion")) {
this.noTeleport = true;
this.noRepledge = true;
} else {
this.noTeleport = false;
this.noRepledge = false;
}
this.hash = rs.getString("hash"); this.hash = rs.getString("hash");
if (this.motto.isEmpty()) { if (this.motto.isEmpty()) {
@@ -345,6 +356,9 @@ public class City extends AbstractWorldObject {
if (ago.getObjectType().equals(GameObjectType.City)) { if (ago.getObjectType().equals(GameObjectType.City)) {
City city = (City) ago; City city = (City) ago;
if (city.noTeleport)
continue;
if (city.parentZone != null && city.parentZone.isPlayerCity()) { if (city.parentZone != null && city.parentZone.isPlayerCity()) {
if (pc.getAccount().status.equals(AccountStatus.ADMIN)) { if (pc.getAccount().status.equals(AccountStatus.ADMIN)) {
@@ -398,6 +412,8 @@ public class City extends AbstractWorldObject {
for (AbstractGameObject ago : worldCities.values()) { for (AbstractGameObject ago : worldCities.values()) {
if (ago.getObjectType().equals(GameObjectType.City)) { if (ago.getObjectType().equals(GameObjectType.City)) {
City city = (City) ago; City city = (City) ago;
if (city.noRepledge)
continue;
if (city.parentZone != null && city.parentZone.isPlayerCity()) { if (city.parentZone != null && city.parentZone.isPlayerCity()) {
-20
View File
@@ -13,7 +13,6 @@ import engine.Enum.DamageType;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.Enum.ItemType; import engine.Enum.ItemType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.LootManager;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -915,23 +914,4 @@ public class ItemBase {
public void setAutoID(boolean autoID) { public void setAutoID(boolean autoID) {
this.autoID = autoID; this.autoID = autoID;
} }
public boolean isVorg(){
return LootManager.vorg_ha_uuids.contains(this.uuid) || LootManager.vorg_ma_uuids.contains(this.uuid) || LootManager.vorg_la_uuids.contains(this.uuid) || LootManager.vorg_cloth_uuids.contains(this.uuid);
}
public String[] getVorgStats() {
if(this.isLightArmor() || this.isMediumArmor() || this.isHeavyArmor() || this.isClothArmor()){
if(this.getValidSlot() == MBServerStatics.SLOT_FEET) {
return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222", "SUF-007","SUF-150"};
}else {
return new String[]{"PRE-130", "PRE-232", "PRE-212", "PRE-222", "SUF-007"};
}
} else if(this.isShield()){//shield
return new String[]{"SUF-265","PRE-123","PRE-232", "PRE-212", "PRE-222"};
} else{//weapon
return new String[]{"PRE-020","PRE-033",};
}
}
} }
-11
View File
@@ -1970,13 +1970,6 @@ public class Mob extends AbstractIntelligenceAgent {
try { try {
NPCManager.applyRuneSetEffects(this); NPCManager.applyRuneSetEffects(this);
recalculateStats(); recalculateStats();
if(this.mobBase.getLevel() > 80){
if(this.getMobBaseID() == 14319){//ithriana
this.healthMax = 5400000;
} else{
this.healthMax = 1500000;
}
}
this.setHealth(this.healthMax); this.setHealth(this.healthMax);
// Set bounds for this mobile // Set bounds for this mobile
@@ -2027,10 +2020,6 @@ public class Mob extends AbstractIntelligenceAgent {
} }
this.deathTime = 0; this.deathTime = 0;
if(this.getName().equals("Chaos Chimera") || this.getName().equals("Taint Horror"))
this.level -= 10;
} catch (Exception e) { } catch (Exception e) {
Logger.error(e.getMessage()); Logger.error(e.getMessage());
} }
+5 -9
View File
@@ -1074,8 +1074,8 @@ public class NPC extends AbstractCharacter {
filteredItemList.add(910010 + subID); filteredItemList.add(910010 + subID);
} }
//if (this.getRank() == 7) if (this.getRank() == 7)
// filteredItemList.add(910018); filteredItemList.add(910018);
} }
return filteredItemList; return filteredItemList;
@@ -1152,13 +1152,9 @@ public class NPC extends AbstractCharacter {
upgradeTime = Integer.MAX_VALUE; upgradeTime = Integer.MAX_VALUE;
if (this.getRank() < 7) { if (this.getRank() < 7)
if(this.contract.getName().contains("Trainer") == false){ return (this.getRank() * 8);
return 5;
}else{
return this.getRank() * 8;
}
}
return 0; return 0;
} }
+1 -21
View File
@@ -26,7 +26,6 @@ import engine.job.JobScheduler;
import engine.jobs.DeferredPowerJob; import engine.jobs.DeferredPowerJob;
import engine.jobs.FinishSpireEffectJob; import engine.jobs.FinishSpireEffectJob;
import engine.jobs.NoTimeJob; import engine.jobs.NoTimeJob;
import engine.math.Bounds;
import engine.math.FastMath; import engine.math.FastMath;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.ByteBufferWriter; import engine.net.ByteBufferWriter;
@@ -53,8 +52,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import static engine.InterestManagement.RealmMap.getRealmAtLocation;
public class PlayerCharacter extends AbstractCharacter { public class PlayerCharacter extends AbstractCharacter {
@@ -271,9 +268,6 @@ public class PlayerCharacter extends AbstractCharacter {
this.hash = rs.getString("hash"); this.hash = rs.getString("hash");
// For debugging skills
// CharacterSkill.printSkills(this);
} }
public static Building getUpdatedBindBuilding(PlayerCharacter player) { public static Building getUpdatedBindBuilding(PlayerCharacter player) {
@@ -4567,9 +4561,6 @@ public class PlayerCharacter extends AbstractCharacter {
this.charItemManager = new CharacterItemManager(this); this.charItemManager = new CharacterItemManager(this);
Bounds playerBounds = Bounds.borrow();
playerBounds.setBounds(this.getLoc());
this.setBounds(playerBounds);
} }
@Override @Override
@@ -4813,18 +4804,6 @@ public class PlayerCharacter extends AbstractCharacter {
updateBlessingMessage(); updateBlessingMessage();
this.safeZone = this.isInSafeZone(); this.safeZone = this.isInSafeZone();
Realm currentRealm = getRealmAtLocation(this.getLoc());
if(currentRealm != null) {
boolean forbiddenRealm = false;
if (Realm.overridePlacement(currentRealm.getRealmName()))
forbiddenRealm = true;
if (forbiddenRealm && this.containsEffect(1672601862) == false) {//Deathshroud
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
}
}
//if(this.isBoxed && this.containsEffect(429611355) == false) {//pathfinding
// PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 429611355, 40, false);
//}
} catch (Exception e) { } catch (Exception e) {
Logger.error(e); Logger.error(e);
@@ -5377,6 +5356,7 @@ public class PlayerCharacter extends AbstractCharacter {
moveToMsg.setSourceType(GameObjectType.PlayerCharacter.ordinal()); moveToMsg.setSourceType(GameObjectType.PlayerCharacter.ordinal());
moveToMsg.setSourceID(this.getObjectUUID()); moveToMsg.setSourceID(this.getObjectUUID());
Dispatch dispatch = Dispatch.borrow(this, moveToMsg); Dispatch dispatch = Dispatch.borrow(this, moveToMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
+5 -42
View File
@@ -76,40 +76,18 @@ public class Realm {
this.mapG = (float) (mapColor.getGreen() * 0.00392156863); this.mapG = (float) (mapColor.getGreen() * 0.00392156863);
this.mapB = (float) (mapColor.getBlue() * 0.00392156863); this.mapB = (float) (mapColor.getBlue() * 0.00392156863);
this.mapA = 1; this.mapA = 1;
if (overridePlacement(rs.getString("realmName"))) { this.canBeClaimed = rs.getBoolean("canBeClaimed");
this.canBeClaimed = false;
this.canPlaceCities = false;
this.numCities = 0;
this.rulingCityUUID = 0;
this.charterType = 0;
this.realmName = "Plagued Land";
} else {
this.canPlaceCities = rs.getBoolean("canPlaceCities"); this.canPlaceCities = rs.getBoolean("canPlaceCities");
this.numCities = rs.getInt("numCities"); this.numCities = rs.getInt("numCities");
if(this.numCities > 0){
this.canBeClaimed = true;
}else{
this.canBeClaimed = false;
}
this.rulingCityUUID = rs.getInt("rulingCityUID");
if (this.rulingCityUUID != 0) {
this.charterType = rs.getInt("charterType");
} else {
this.charterType = 0;
}
this.realmName = rs.getString("realmName"); this.realmName = rs.getString("realmName");
} this.rulingCityUUID = rs.getInt("rulingCityUID");
this.charterType = rs.getInt("charterType");
java.sql.Timestamp ruledTimeStamp = rs.getTimestamp("ruledSince"); java.sql.Timestamp ruledTimeStamp = rs.getTimestamp("ruledSince");
if (ruledTimeStamp != null){ if (ruledTimeStamp != null)
this.ruledSince = LocalDateTime.ofInstant(ruledTimeStamp.toInstant(), ZoneId.systemDefault()); this.ruledSince = LocalDateTime.ofInstant(ruledTimeStamp.toInstant(), ZoneId.systemDefault());
}else {
this.rulingCityUUID = 0;
this.charterType = 0;
}
this.mapY1 = rs.getFloat("mapY1"); this.mapY1 = rs.getFloat("mapY1");
this.mapX1 = rs.getFloat("mapX1"); this.mapX1 = rs.getFloat("mapX1");
this.mapY2 = rs.getFloat("mapY2"); this.mapY2 = rs.getFloat("mapY2");
@@ -122,21 +100,6 @@ public class Realm {
this.hash = rs.getString("hash"); this.hash = rs.getString("hash");
} }
public static boolean overridePlacement(String realm){
switch(realm.toLowerCase()) {
case "neshraa":
case "adduram":
case "letharuun":
case "kralgaard":
//case "ecklund":
case "nordenthol":
case "thollmar":
case "haldorn isles":
case "hregenlund":
return true;
}
return false;
}
public static void configureAllRealms() { public static void configureAllRealms() {
for (Realm realm : Realm._realms.values()) { for (Realm realm : Realm._realms.values()) {
-41
View File
@@ -74,11 +74,7 @@ public class Zone extends AbstractGameObject {
this.zCoord = rs.getFloat("ZCoord"); this.zCoord = rs.getFloat("ZCoord");
this.yCoord = rs.getFloat("YOffset"); this.yCoord = rs.getFloat("YOffset");
this.loadNum = rs.getInt("LoadNum"); this.loadNum = rs.getInt("LoadNum");
if(overrideSafety(rs.getString("Name"))){
this.safeZone = (byte) 0;
}else {
this.safeZone = rs.getByte("SafeZone"); this.safeZone = rs.getByte("SafeZone");
}
this.Icon1 = rs.getString("Icon1"); this.Icon1 = rs.getString("Icon1");
this.Icon2 = rs.getString("Icon2"); this.Icon2 = rs.getString("Icon2");
this.Icon3 = rs.getString("Icon3"); this.Icon3 = rs.getString("Icon3");
@@ -107,44 +103,7 @@ public class Zone extends AbstractGameObject {
} }
public static boolean skipZone(String name){
switch(name){
case "Kralgar Holm":
case "Doomhorn Skrae":
case "Ymur's Crown":
case "Ecklund Wilds":
case "Ragnir Holm":
case "Aurrochs Skrae":
case "Hregerend Wildlands":
case "The Blood Sands":
case "Vale of Nar Addad":
case "Kharsoom":
case "Leth'khalivar Desert":
case "Thollok Marsh":
case "The Black Bog":
case "sevaath Mere":
return true;
}
return false;
}
public static boolean overrideSafety(String name){
switch(name){
case"Sanctuary":
case "All-Father's Rest":
case "Hamlet of Hothor's Doom":
case"Hamlet of Hrimdal":
case "Hamlet of Valkirch":
case "Hamlet of Scraefahl":
case "Hamlet of Hengest":
case "Starkholm":
case "Aeldreth Havens":
case "Erkeng Hold":
case "Sea Dog's Rest":
return false;
}
return true;
}
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) { public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
if (zone.loadNum == 0 && zone.playerCityID == 0) if (zone.loadNum == 0 && zone.playerCityID == 0)
+1 -1
View File
@@ -15,7 +15,6 @@ import engine.Enum.DispatchChannel;
import engine.Enum.MinionType; import engine.Enum.MinionType;
import engine.Enum.SupportMsgType; import engine.Enum.SupportMsgType;
import engine.InterestManagement.HeightMap; import engine.InterestManagement.HeightMap;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.RealmMap; import engine.InterestManagement.RealmMap;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.db.archive.DataWarehouse; import engine.db.archive.DataWarehouse;
@@ -711,6 +710,7 @@ public class WorldServer {
} }
player.getTimestamps().put("logout", System.currentTimeMillis()); player.getTimestamps().put("logout", System.currentTimeMillis());
player.setEnteredWorld(false); player.setEnteredWorld(false);
// remove from simulation and zero current loc // remove from simulation and zero current loc
WorldGrid.RemoveWorldObject(player); WorldGrid.RemoveWorldObject(player);