Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c5facaefc | |||
| ce8dc09a95 | |||
| dce3822d43 | |||
| f4ceab41dd | |||
| bd370097ab | |||
| cbb3fd0b24 | |||
| 944269b78e | |||
| 530747ed75 | |||
| 6d8866f019 | |||
| d52bef8252 | |||
| 3cf6bba0f4 | |||
| acc253aa4d | |||
| fea1c2f06a |
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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..
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.hirelings.size() == numOfSlots)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return building.hirelings.size();
|
||||||
|
|
||||||
if (!building.getHirelings().containsValue(i))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user