Compare commits

...

13 Commits

Author SHA1 Message Date
MagicBot 0c5facaefc Dev command updated to reflect index slotting. 2024-02-04 13:35:40 -05:00
MagicBot ce8dc09a95 Update to list based lookup 2024-02-04 13:23:28 -05:00
MagicBot dce3822d43 Update to list based lookup 2024-02-04 13:18:52 -05:00
MagicBot f4ceab41dd Update to list based lookup 2024-02-04 12:48:59 -05:00
MagicBot bd370097ab Update to list based lookup 2024-02-04 12:32:10 -05:00
MagicBot cbb3fd0b24 Proper null test needed 2024-02-04 12:27:17 -05:00
MagicBot 944269b78e Slot is index driven. 2024-02-04 11:39:49 -05:00
MagicBot 530747ed75 Slot is index driven. 2024-02-04 11:35:43 -05:00
MagicBot 6d8866f019 Refactor to concurrent list. 2024-02-04 11:28:48 -05:00
MagicBot d52bef8252 Refresh method created. 2024-02-04 08:23:54 -05:00
MagicBot 3cf6bba0f4 Refresh method created. 2024-02-04 08:18:46 -05:00
MagicBot acc253aa4d Removed unused method 2024-02-04 08:02:42 -05:00
MagicBot fea1c2f06a Raised visibility of collection 2024-02-04 08:02:13 -05:00
13 changed files with 84 additions and 146 deletions
+3 -3
View File
@@ -220,16 +220,16 @@ public class InfoCmd extends AbstractDevCmd {
// List hirelings // List hirelings
if (targetBuilding.getHirelings().isEmpty() == false) { if (targetBuilding.hirelings.isEmpty() == false) {
output += newline; output += newline;
output += "Hirelings List: name / slot / floor"; output += "Hirelings List: name / slot / floor";
for (AbstractCharacter npc : targetBuilding.getHirelings().keySet()) { for (AbstractCharacter npc : targetBuilding.hirelings) {
if (npc.getObjectType() != GameObjectType.NPC) if (npc.getObjectType() != GameObjectType.NPC)
continue; continue;
output += newline + npc.getName() + " slot " + targetBuilding.getHirelings().get(npc); output += newline + npc.getName() + " slot " + targetBuilding.hirelings.indexOf(npc);
output += newline + "location " + npc.getLoc(); output += newline + "location " + npc.getLoc();
} }
} }
+2 -2
View File
@@ -48,7 +48,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
for (Building building : zone.zoneBuildingSet) { for (Building building : zone.zoneBuildingSet) {
if (!BuildingManager.IsWallPiece(building)) if (!BuildingManager.IsWallPiece(building))
continue; continue;
for (AbstractCharacter ac : building.getHirelings().keySet()) { for (AbstractCharacter ac : building.hirelings) {
NPC npc = null; NPC npc = null;
Mob mobA = null; Mob mobA = null;
@@ -143,7 +143,7 @@ public class PurgeObjectsCmd extends AbstractDevCmd {
if ((building.getBlueprint() != null) && (building.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE)) if ((building.getBlueprint() != null) && (building.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE))
building.disableSpire(false); building.disableSpire(false);
for (AbstractCharacter ac : building.getHirelings().keySet()) { for (AbstractCharacter ac : building.hirelings) {
NPC npc = null; NPC npc = null;
Mob mobA = null; Mob mobA = null;
+7 -4
View File
@@ -13,7 +13,10 @@ import engine.Enum.BuildingGroup;
import engine.Enum.DbObjectType; import engine.Enum.DbObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@@ -141,7 +144,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
// Remove hirelings for this building // Remove hirelings for this building
for (AbstractCharacter abstractCharacter : building.getHirelings().keySet()) for (AbstractCharacter abstractCharacter : building.hirelings)
BuildingManager.removeHireling(building, abstractCharacter); BuildingManager.removeHireling(building, abstractCharacter);
Zone zone = building.getParentZone(); Zone zone = building.getParentZone();
@@ -170,7 +173,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
// Remove npc from hirelings list. // Remove npc from hirelings list.
if (npc.building != null) if (npc.building != null)
npc.building.getHirelings().remove(npc); npc.building.hirelings.remove(npc);
for (Integer minionUUID : npc.minions) { for (Integer minionUUID : npc.minions) {
Mob minionMob = Mob.getMob(minionUUID); Mob minionMob = Mob.getMob(minionUUID);
@@ -207,7 +210,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
// Remove npc from hirelings list. // Remove npc from hirelings list.
if (mob.building != null) if (mob.building != null)
mob.building.getHirelings().remove(mob); mob.building.hirelings.remove(mob);
mob.setLoc(Vector3fImmutable.ZERO); //Move it off the plane.. mob.setLoc(Vector3fImmutable.ZERO); //Move it off the plane..
mob.setBindLoc(Vector3fImmutable.ZERO); //Reset the bind loc.. mob.setBindLoc(Vector3fImmutable.ZERO); //Reset the bind loc..
+5 -5
View File
@@ -53,7 +53,7 @@ public class SlotTestCmd extends AbstractDevCmd {
int slot = Integer.parseInt(args[0]); int slot = Integer.parseInt(args[0]);
Vector3fImmutable slotLocation; Vector3fImmutable slotLocation;
BuildingLocation buildingLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot - 1); BuildingLocation buildingLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot);
slotLocation = building.getLoc().add(buildingLocation.getLocation()); slotLocation = building.getLoc().add(buildingLocation.getLocation());
slotLocation = Vector3fImmutable.rotateAroundPoint(building.getLoc(), slotLocation, building.getBounds().getQuaternion().angleY); slotLocation = Vector3fImmutable.rotateAroundPoint(building.getLoc(), slotLocation, building.getBounds().getQuaternion().angleY);
playerCharacter.teleport(slotLocation); playerCharacter.teleport(slotLocation);
@@ -61,17 +61,17 @@ public class SlotTestCmd extends AbstractDevCmd {
} }
for (BuildingLocation buildingLocation : BuildingManager._slotLocations.get(building.meshUUID)) for (BuildingLocation buildingLocation : BuildingManager._slotLocations.get(building.meshUUID))
outString += buildingLocation.getSlot() + buildingLocation.getLocation().toString() + "\r\n"; outString += buildingLocation.getSlot() - 1 + buildingLocation.getLocation().toString() + "\r\n";
outString += "\r\nNext Available Slot: " + BuildingManager.getAvailableSlot(building); outString += "\r\nNext Available Slot: " + BuildingManager.getAvailableSlot(building);
if (building.getHirelings().isEmpty() == false) { if (building.hirelings.isEmpty() == false) {
outString += "\r\n\r\n"; outString += "\r\n\r\n";
outString += "Hirelings List:"; outString += "Hirelings List:";
for (AbstractCharacter hireling : building.getHirelings().keySet()) for (AbstractCharacter hireling : building.hirelings)
outString += "\r\n" + hireling.getName() + " slot : " + building.getHirelings().get(hireling); outString += "\r\n" + hireling.getName() + " slot : " + building.hirelings.indexOf(hireling);
} }
+39 -99
View File
@@ -19,10 +19,7 @@ import engine.job.JobScheduler;
import engine.jobs.UpgradeBuildingJob; import engine.jobs.UpgradeBuildingJob;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.ManageCityAssetsMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -56,12 +53,14 @@ public enum BuildingManager {
int numOfSlots = _slotLocations.get(building.meshUUID).size(); int numOfSlots = _slotLocations.get(building.meshUUID).size();
for (int i = 1; i <= numOfSlots; i++) { if (building.hirelings.isEmpty())
return 0;
if (!building.getHirelings().containsValue(i)) if (building.hirelings.size() == numOfSlots)
return i;
}
return -1; return -1;
return building.hirelings.size();
} }
public static int getLastAvailableSlot(Building building) { public static int getLastAvailableSlot(Building building) {
@@ -76,12 +75,13 @@ public enum BuildingManager {
int numOfSlots = _slotLocations.get(building.meshUUID).size(); int numOfSlots = _slotLocations.get(building.meshUUID).size();
for (int i = numOfSlots; i > 0; i--) { if (building.hirelings.isEmpty())
return numOfSlots - 1;
if (!building.getHirelings().containsValue(i)) if (building.hirelings.size() == numOfSlots)
return i;
}
return -1; return -1;
return numOfSlots - 1;
} }
public static BuildingLocation getSlotLocation(Building building, int slot) { public static BuildingLocation getSlotLocation(Building building, int slot) {
@@ -91,7 +91,7 @@ public enum BuildingManager {
if (slot == -1) if (slot == -1)
return buildingLocation; return buildingLocation;
buildingLocation = _slotLocations.get(building.meshUUID).get(slot - 1); // array index buildingLocation = _slotLocations.get(building.meshUUID).get(slot); // array index
if (buildingLocation == null) { if (buildingLocation == null) {
Logger.error("Invalid slot for building: " + building.getObjectUUID()); Logger.error("Invalid slot for building: " + building.getObjectUUID());
@@ -100,6 +100,20 @@ public enum BuildingManager {
return buildingLocation; return buildingLocation;
} }
public static void updateHirelingSlots(Building building) {
// Method updates all hirelings with the slot locations
// for the current mesh. The position and region can change
// such as when upgrading a TOL to R8.
for (AbstractCharacter hireling : building.hirelings) {
hireling.setLoc(getSlotLocation(building, building.hirelings.indexOf(hireling)).getLocation());
InterestManager.setObjectDirty(hireling);
}
}
public static boolean playerCanManage(PlayerCharacter player, Building building) { public static boolean playerCanManage(PlayerCharacter player, Building building) {
if (player == null) if (player == null)
@@ -291,7 +305,7 @@ public enum BuildingManager {
// Method transfers ownership of all hirelings in a building // Method transfers ownership of all hirelings in a building
public static void refreshHirelings(Building building) { public static void updateHirelingGuilds(Building building) {
if (building == null) if (building == null)
return; return;
@@ -303,7 +317,7 @@ public enum BuildingManager {
else else
newGuild = building.getOwner().getGuild(); newGuild = building.getOwner().getGuild();
for (AbstractCharacter hireling : building.getHirelings().keySet()) { for (AbstractCharacter hireling : building.hirelings) {
hireling.setGuild(newGuild); hireling.setGuild(newGuild);
WorldGrid.updateObject(hireling); WorldGrid.updateObject(hireling);
} }
@@ -336,7 +350,7 @@ public enum BuildingManager {
// Remove hireling from building // Remove hireling from building
building.getHirelings().remove(hireling); building.hirelings.remove(hireling);
// Remove from zone mob set // Remove from zone mob set
@@ -388,7 +402,7 @@ public enum BuildingManager {
if (building.getRank() < 1) { if (building.getRank() < 1) {
for (AbstractCharacter slottedNPC : building.getHirelings().keySet()) for (AbstractCharacter slottedNPC : building.hirelings)
BuildingManager.removeHireling(building, slottedNPC); BuildingManager.removeHireling(building, slottedNPC);
return; return;
@@ -396,14 +410,17 @@ public enum BuildingManager {
// Delete hireling if building has deranked. // Delete hireling if building has deranked.
for (AbstractCharacter hireling : building.getHirelings().keySet()) { for (AbstractCharacter hireling : building.hirelings) {
if (building.getHirelings().get(hireling) > building.getBlueprint().getSlotsForRank(building.getRank())) if (building.hirelings.indexOf(hireling) + 1 > building.getBlueprint().getSlotsForRank(building.getRank()))
BuildingManager.removeHireling(building, hireling); BuildingManager.removeHireling(building, hireling);
} }
refreshHirelings(building); // Update hireling guilds and locations
updateHirelingGuilds(building);
updateHirelingSlots(building);
} }
public static Building getBuilding(int id) { public static Building getBuilding(int id) {
@@ -564,7 +581,7 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0) if (building.getBlueprintUUID() == 0)
return false; return false;
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size()) if (building.getBlueprint().getMaxSlots() == building.hirelings.size())
return false; return false;
String pirateName = NPCManager.getPirateName(contract.getMobbaseID()); String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
@@ -777,83 +794,6 @@ public enum BuildingManager {
} }
public static void processRedeedNPC(NPC npc, Building building, ClientConnection origin) {
// Member variable declaration
PlayerCharacter player;
Contract contract;
CharacterItemManager itemMan;
ItemBase itemBase;
Item item;
npc.lock.writeLock().lock();
try {
if (building == null)
return;
player = SessionManager.getPlayerCharacter(origin);
itemMan = player.getCharItemManager();
contract = npc.getContract();
if (!player.getCharItemManager().hasRoomInventory((short) 1)) {
ErrorPopupMsg.sendErrorPopup(player, 21);
return;
}
if (!building.getHirelings().containsKey(npc))
return;
if (!npc.remove()) {
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "A Serious error has occurred. Please post details for to ensure transaction integrity");
return;
}
building.getHirelings().remove(npc);
itemBase = ItemBase.getItemBase(contract.getContractID());
if (itemBase == null) {
Logger.error("Could not find Contract for npc: " + npc.getObjectUUID());
return;
}
boolean itemWorked = false;
item = new Item(itemBase, player.getObjectUUID(), Enum.OwnerType.PlayerCharacter, (byte) ((byte) npc.getRank() - 1), (byte) ((byte) npc.getRank() - 1),
(short) 1, (short) 1, true, false, Enum.ItemContainerType.INVENTORY, (byte) 0,
new ArrayList<>(), "");
item.setNumOfItems(1);
item.containerType = Enum.ItemContainerType.INVENTORY;
try {
item = DbManager.ItemQueries.ADD_ITEM(item);
itemWorked = true;
} catch (Exception e) {
Logger.error(e);
}
if (itemWorked) {
itemMan.addItemToInventory(item);
itemMan.updateInventory();
}
ManageCityAssetsMsg mca = new ManageCityAssetsMsg();
mca.actionType = NPC.SVR_CLOSE_WINDOW;
mca.setTargetType(building.getObjectType().ordinal());
mca.setTargetID(building.getObjectUUID());
origin.sendMsg(mca);
} catch (Exception e) {
Logger.error(e);
} finally {
npc.lock.writeLock().unlock();
}
}
public static void rebuildMine(Building mineBuilding) { public static void rebuildMine(Building mineBuilding) {
setRank(mineBuilding, 1); setRank(mineBuilding, 1);
mineBuilding.meshUUID = mineBuilding.getBlueprint().getMeshForRank(mineBuilding.rank); mineBuilding.meshUUID = mineBuilding.getBlueprint().getMeshForRank(mineBuilding.rank);
@@ -871,7 +811,7 @@ public enum BuildingManager {
boolean success; boolean success;
// If this building has no blueprint then set rank and exit immediatly. // If this building has no blueprint then set rank and exit immediately.
if (building.blueprintUUID == 0 || building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)) { if (building.blueprintUUID == 0 || building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)) {
building.rank = rank; building.rank = rank;
@@ -889,7 +829,7 @@ public enum BuildingManager {
Logger.error("failed to cancel existing upgrade job."); Logger.error("failed to cancel existing upgrade job.");
} }
// Attempt write to database, or delete the building // Attempt to write to database, or delete the building
// if we are destroying it. // if we are destroying it.
if (rank == -1) if (rank == -1)
+1 -4
View File
@@ -5,17 +5,14 @@ import engine.InterestManagement.WorldGrid;
import engine.math.Quaternion; import engine.math.Quaternion;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mobileAI.MobAI;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
import engine.net.client.msg.PetMsg; import engine.net.client.msg.PetMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import engine.powers.PowersBase;
import engine.powers.RuneSkillAdjustEntry; import engine.powers.RuneSkillAdjustEntry;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import javax.smartcardio.ATR;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -200,7 +197,7 @@ public enum NPCManager {
// Pets are regular mobiles not hirelings (Siege engines) // Pets are regular mobiles not hirelings (Siege engines)
if (abstractCharacter.contract != null) if (abstractCharacter.contract != null)
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot); abstractCharacter.building.hirelings.addIfAbsent(abstractCharacter);
// Override bind and location for this npc derived // Override bind and location for this npc derived
// from BuildingManager slot location data. // from BuildingManager slot location data.
@@ -78,7 +78,7 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
return false; return false;
} }
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size()) if (building.getBlueprint().getMaxSlots() == building.hirelings.size())
return false; return false;
Item contractItem = Item.getFromCache(msg.getContractItem()); Item contractItem = Item.getFromCache(msg.getContractItem());
@@ -54,7 +54,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
return; return;
} }
if (!building.getHirelings().containsKey(hireling)) if (!building.hirelings.contains(hireling))
return; return;
BuildingManager.removeHireling(building, hireling); BuildingManager.removeHireling(building, hireling);
@@ -402,7 +402,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return true; return true;
if (building.getHirelings().containsKey(npc) == false) if (building.hirelings.contains(npc) == false)
return true; return true;
@@ -421,7 +421,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (ManageCityAssetMsgHandler.playerCanManageNotFriends(player, building) == false) if (ManageCityAssetMsgHandler.playerCanManageNotFriends(player, building) == false)
return true; return true;
if (building.getHirelings().containsKey(npc) == false) if (building.hirelings.contains(npc) == false)
return true; return true;
if (npc.remove() == false) { if (npc.remove() == false) {
@@ -515,7 +515,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return true; return true;
if (!building.getHirelings().containsKey(mob)) if (!building.hirelings.contains(mob))
return true; return true;
if (player.getCharItemManager().getTradingWith() != null) { if (player.getCharItemManager().getTradingWith() != null) {
@@ -531,7 +531,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (BuildingManager.playerCanManage(player, building) == false) if (BuildingManager.playerCanManage(player, building) == false)
return true; return true;
if (building.getHirelings().containsKey(mob) == false) if (building.hirelings.contains(mob) == false)
return true; return true;
BuildingManager.removeHireling(building, mob); BuildingManager.removeHireling(building, mob);
@@ -24,7 +24,6 @@ import org.joda.time.Period;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* Open manage city asset window * Open manage city asset window
@@ -229,8 +228,8 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(asset.getObjectUUID()); writer.putInt(asset.getObjectUUID());
writer.putInt(0); writer.putInt(0);
writer.putInt(0); writer.putInt(0);
writer.putInt(asset.getHirelings().size()); writer.putInt(asset.hirelings.size());
for (AbstractCharacter hireling : asset.getHirelings().keySet()) { for (AbstractCharacter hireling : asset.hirelings) {
if (!hireling.getObjectType().equals(GameObjectType.NPC)) if (!hireling.getObjectType().equals(GameObjectType.NPC))
writer.putString(hireling.getName()); writer.putString(hireling.getName());
else { else {
@@ -262,9 +261,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
for (int a = 0; a < 5; a++) for (int a = 0; a < 5; a++)
writer.putInt(0); writer.putInt(0);
writer.putInt(asset.getHirelings().size()); writer.putInt(asset.hirelings.size());
for (AbstractCharacter npcHire : asset.getHirelings().keySet()) { for (AbstractCharacter npcHire : asset.hirelings) {
writer.putInt(npcHire.getObjectType().ordinal()); writer.putInt(npcHire.getObjectType().ordinal());
writer.putInt(npcHire.getObjectUUID()); writer.putInt(npcHire.getObjectUUID());
if (npcHire.getObjectType() == GameObjectType.NPC) if (npcHire.getObjectType() == GameObjectType.NPC)
@@ -668,11 +667,11 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(1); writer.putInt(1);
} }
writer.putInt(building.hirelings.size());
ConcurrentHashMap<AbstractCharacter, Integer> npcList = building.getHirelings(); if (building.hirelings.size() > 0) {
writer.putInt(npcList.size());
if (npcList.size() > 0) { for (AbstractCharacter npcHire : building.hirelings) {
for (AbstractCharacter npcHire : npcList.keySet()) {
writer.putInt(npcHire.getObjectType().ordinal()); writer.putInt(npcHire.getObjectType().ordinal());
if (npcHire.getObjectType() == GameObjectType.Mob) if (npcHire.getObjectType() == GameObjectType.Mob)
writer.putInt(((Mob) npcHire).getDBID()); writer.putInt(((Mob) npcHire).getDBID());
+4 -8
View File
@@ -41,6 +41,7 @@ import java.time.ZoneId;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -51,7 +52,7 @@ public class Building extends AbstractWorldObject {
// Used for thread safety // Used for thread safety
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ConcurrentHashMap<AbstractCharacter, Integer> hirelings = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); public CopyOnWriteArrayList<AbstractCharacter> hirelings = new CopyOnWriteArrayList<>();
private final HashMap<Integer, DoorCloseJob> doorJobs = new HashMap<>(); private final HashMap<Integer, DoorCloseJob> doorJobs = new HashMap<>();
public int meshUUID; public int meshUUID;
public Zone parentZone; public Zone parentZone;
@@ -647,12 +648,11 @@ public class Building extends AbstractWorldObject {
// Add costs associated with hirelings // Add costs associated with hirelings
for (AbstractCharacter npc : this.hirelings.keySet()) { for (AbstractCharacter npc : this.hirelings) {
if (npc.getObjectType() != GameObjectType.NPC) if (npc.getObjectType() != GameObjectType.NPC)
continue; continue;
maintCost += Blueprint.getNpcMaintCost(npc.getRank()); maintCost += Blueprint.getNpcMaintCost(npc.getRank());
} }
@@ -1031,7 +1031,7 @@ public class Building extends AbstractWorldObject {
// Set new guild for hirelings and refresh all clients // Set new guild for hirelings and refresh all clients
this.refreshGuild(); this.refreshGuild();
BuildingManager.refreshHirelings(this); BuildingManager.updateHirelingGuilds(this);
} catch (Exception e) { } catch (Exception e) {
Logger.error("Error updating owner! UUID: " + this.getObjectUUID()); Logger.error("Error updating owner! UUID: " + this.getObjectUUID());
@@ -1213,10 +1213,6 @@ public class Building extends AbstractWorldObject {
this.updateEffects(); this.updateEffects();
} }
public ConcurrentHashMap<AbstractCharacter, Integer> getHirelings() {
return hirelings;
}
public final boolean isSpireIsActive() { public final boolean isSpireIsActive() {
return spireIsActive; return spireIsActive;
} }
+1 -1
View File
@@ -656,7 +656,7 @@ public class City extends AbstractWorldObject {
if (this.getTOL() == null) if (this.getTOL() == null)
return outNPC; return outNPC;
for (AbstractCharacter npc : getTOL().getHirelings().keySet()) { for (AbstractCharacter npc : getTOL().hirelings) {
if (npc.getObjectType() == GameObjectType.NPC) if (npc.getObjectType() == GameObjectType.NPC)
if (((NPC) npc).getContract().isRuneMaster() == true) if (((NPC) npc).getContract().isRuneMaster() == true)
outNPC = (NPC) npc; outNPC = (NPC) npc;
+5 -2
View File
@@ -11,7 +11,10 @@ package engine.objects;
import engine.Enum; import engine.Enum;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.gameManager.*; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.net.ByteBufferWriter; import engine.net.ByteBufferWriter;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
@@ -547,7 +550,7 @@ public class Mine extends AbstractGameObject {
Building mineBuilding = BuildingManager.getBuilding(this.buildingID); Building mineBuilding = BuildingManager.getBuilding(this.buildingID);
if (mineBuilding == null) if (mineBuilding == null)
return this.production.baseProduction; return this.production.baseProduction;
for (AbstractCharacter harvester : mineBuilding.getHirelings().keySet()) { for (AbstractCharacter harvester : mineBuilding.hirelings) {
totalModded += baseModValue; totalModded += baseModValue;
totalModded += rankModValue * harvester.getRank(); totalModded += rankModValue * harvester.getRank();
} }
+1 -1
View File
@@ -1119,7 +1119,7 @@ public class NPC extends AbstractCharacter {
building = this.building; building = this.building;
if (building != null) { if (building != null) {
building.getHirelings().remove(this); building.hirelings.remove(this);
this.removeMinions(); this.removeMinions();
} }