Browse Source

New less ungodly NPC constructor.

master
MagicBot 1 year ago
parent
commit
740e75f8e4
  1. 4
      src/engine/db/handlers/dbNPCHandler.java
  2. 79
      src/engine/gameManager/BuildingManager.java
  3. 2
      src/engine/net/client/handlers/OrderNPCMsgHandler.java
  4. 220
      src/engine/objects/NPC.java

4
src/engine/db/handlers/dbNPCHandler.java

@ -31,7 +31,7 @@ public class dbNPCHandler extends dbHandlerBase { @@ -31,7 +31,7 @@ public class dbNPCHandler extends dbHandlerBase {
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
}
public NPC ADD_NPC(NPC toAdd, boolean isMob) {
public NPC PERSIST(NPC toAdd) {
NPC npc = null;
@ -50,7 +50,7 @@ public class dbNPCHandler extends dbHandlerBase { @@ -50,7 +50,7 @@ public class dbNPCHandler extends dbHandlerBase {
preparedStatement.setFloat(10, toAdd.getSellPercent());
if (toAdd.getBuilding() != null)
preparedStatement.setInt(11, toAdd.getBuilding().getObjectUUID());
preparedStatement.setInt(11, toAdd.buildingUUID);
else
preparedStatement.setInt(11, 0);

79
src/engine/gameManager/BuildingManager.java

@ -19,7 +19,10 @@ import engine.job.JobScheduler; @@ -19,7 +19,10 @@ import engine.job.JobScheduler;
import engine.jobs.UpgradeBuildingJob;
import engine.math.Bounds;
import engine.math.Vector3fImmutable;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.ManageCityAssetsMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@ -708,4 +711,80 @@ public enum BuildingManager { @@ -708,4 +711,80 @@ 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();
}
}
}

2
src/engine/net/client/handlers/OrderNPCMsgHandler.java

@ -303,7 +303,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler { @@ -303,7 +303,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (cityBuilding == null)
return;
NPC.processRedeedNPC(npc, npc.building, origin);
BuildingManager.processRedeedNPC(npc, npc.building, origin);
break;
case Mob:
Mob mob = (Mob) abstractCharacter;

220
src/engine/objects/NPC.java

@ -23,8 +23,10 @@ import engine.math.Vector3fImmutable; @@ -23,8 +23,10 @@ import engine.math.Vector3fImmutable;
import engine.net.ByteBufferWriter;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.ItemProductionMsg;
import engine.net.client.msg.PetMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.server.MBServerStatics;
import org.joda.time.DateTime;
import org.pmw.tinylog.Logger;
@ -48,6 +50,7 @@ public class NPC extends AbstractCharacter { @@ -48,6 +50,7 @@ public class NPC extends AbstractCharacter {
// Used for thread safety
public final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ArrayList<MobLoot> rolling = new ArrayList<>();
private final ConcurrentHashMap<Mob, Integer> siegeMinionMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
public ReentrantReadWriteLock minionLock = new ReentrantReadWriteLock();
public ArrayList<ProducedItem> forgedItems = new ArrayList<>();
public HashMap<Integer, MobEquipment> equip = null;
@ -73,37 +76,15 @@ public class NPC extends AbstractCharacter { @@ -73,37 +76,15 @@ public class NPC extends AbstractCharacter {
// Variables NOT to be stored in db
protected boolean isStatic = false;
private DateTime upgradeDateTime = null;
private final ConcurrentHashMap<Mob, Integer> siegeMinionMap = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
private HashSet<Integer> canRoll = null;
private int parentZoneID;
private int equipmentSetID = 0;
private int repairCost = 5;
// New NPC constructor. Fill in the blanks and then call
// PERSIST.
/**
* No Id Constructor
*/
public NPC(String name, short statStrCurrent, short statDexCurrent, short statConCurrent,
short statIntCurrent, short statSpiCurrent, short level, int exp, boolean sit, boolean walk, boolean combat, Vector3fImmutable bindLoc,
Vector3fImmutable currentLoc, Vector3fImmutable faceDir, short healthCurrent, short manaCurrent, short stamCurrent, Guild guild,
byte runningTrains, int npcType, boolean isMob, Building building, int contractID, Zone parent) {
super(name, "", statStrCurrent, statDexCurrent, statConCurrent, statIntCurrent, statSpiCurrent, level, exp,
bindLoc, faceDir, guild, runningTrains);
this.loadID = npcType;
this.contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
if (this.contract != null)
this.mobBase = MobBase.getMobBase(this.contract.getMobbaseID());
else
this.mobBase = MobBase.getMobBase(loadID);
this.name = name;
this.buyPercent = 0.33f;
this.sellPercent = 1f;
this.building = building;
this.guild = guild;
this.parentZone = parent;
this.parentZoneID = parent.getObjectUUID();
public NPC() {
this.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
this.currentID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET;
@ -290,12 +271,8 @@ public class NPC extends AbstractCharacter { @@ -290,12 +271,8 @@ public class NPC extends AbstractCharacter {
cnt = serializeExtraRune(npc, 252647, cnt, writer);
//Healer trainer
if (isHealer) {
// int healerRune = 2501;
// if (npc.getLevel() >= 60)
//healerRune = 252592;
if (isHealer)
cnt = serializeExtraRune(npc, 252592, cnt, writer);
}
if (classID != 0) {
writer.putInt(4);
@ -306,9 +283,8 @@ public class NPC extends AbstractCharacter { @@ -306,9 +283,8 @@ public class NPC extends AbstractCharacter {
}
//Scout trainer
if (isArcher) {
if (isArcher)
cnt = serializeExtraRune(npc, 252654, cnt, writer);
}
//Shopkeeper
writer.putInt(5);
@ -470,6 +446,7 @@ public class NPC extends AbstractCharacter { @@ -470,6 +446,7 @@ public class NPC extends AbstractCharacter {
writer.putInt(5);
writer.putInt(0);
writer.putInt(runeID);
if (cnt == 0)
writer.putInt(GameObjectType.NPCClassRuneTwo.ordinal());
else
@ -481,30 +458,28 @@ public class NPC extends AbstractCharacter { @@ -481,30 +458,28 @@ public class NPC extends AbstractCharacter {
public static NPC createNPC(String name, int contractID, Vector3fImmutable spawn, Guild guild, boolean isMob, Zone parent, short level, Building building) {
NPC npcWithoutID = new NPC(name, (short) 0, (short) 0, (short) 0, (short) 0,
(short) 0, (short) 1, 0, false, false, false, spawn, spawn, Vector3fImmutable.ZERO,
(short) 1, (short) 1, (short) 1, guild, (byte) 0, 0, isMob, building, contractID, parent);
npcWithoutID.setLevel(level);
NPC newNPC = new NPC();
if (npcWithoutID.mobBase == null)
return null;
// Parent zone is required by dbhandler. Can likely
// refactor that out and just use the id.
newNPC.name = name;
newNPC.contractUUID = contractID;
npcWithoutID.parentZone = parent;
npcWithoutID.parentZoneID = parent.getObjectUUID();
if (building == null)
newNPC.bindLoc = spawn;
else
newNPC.bindLoc = Vector3fImmutable.ZERO;
// NPC in a Building derives position from slot
newNPC.parentZoneID = parent.getObjectUUID();
newNPC.guildUUID = guild.getObjectUUID();
newNPC.buildingUUID = building.getObjectUUID();
newNPC.level = level;
if (npcWithoutID.building != null)
npcWithoutID.bindLoc = Vector3fImmutable.ZERO;
newNPC.buyPercent = .33f;
newNPC.sellPercent = 1;
NPC npc;
try {
npc = DbManager.NPCQueries.ADD_NPC(npcWithoutID, isMob);
npc = DbManager.NPCQueries.PERSIST(newNPC);
npc.setObjectTypeMask(MBServerStatics.MASK_NPC);
} catch (Exception e) {
Logger.error(e);
@ -562,83 +537,6 @@ public class NPC extends AbstractCharacter { @@ -562,83 +537,6 @@ public class NPC extends AbstractCharacter {
return NPCProfits.ProfitCache.get(npc.currentID);
}
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(), 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 = 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 final void submitUpgradeJob() {
JobContainer jc;
@ -673,74 +571,6 @@ public class NPC extends AbstractCharacter { @@ -673,74 +571,6 @@ public class NPC extends AbstractCharacter {
return currentID;
}
private void initializeNPC() {
if (ConfigManager.serverType.equals(ServerType.LOGINSERVER))
return;
// NPC Guild owners have no contract
if (this.contract == null)
return;
// Configure parent zone adding this NPC to the
// zone collection
this.parentZone = ZoneManager.getZoneByUUID(this.parentZoneID);
this.parentZone.zoneNPCSet.remove(this);
this.parentZone.zoneNPCSet.add(this);
// Setup location for this NPC
this.bindLoc = new Vector3fImmutable(this.statLat, this.statAlt, this.statLon);
this.bindLoc = this.parentZone.getLoc().add(this.bindLoc);
this.loc = new Vector3fImmutable(bindLoc);
// Handle NPCs within buildings
if (this.building != null)
NPCManager.slotCharacterInBuilding(this);
if (this.contract != null) {
this.symbol = this.contract.getIconID();
this.modTypeTable = this.contract.getNPCModTypeTable();
this.modSuffixTable = this.contract.getNpcModSuffixTable();
this.itemModTable = this.contract.getItemModTable();
int VID = this.contract.getVendorID();
if (VID != 0)
this.vendorID = VID;
else
this.vendorID = 1; //no vendor items
}
if (this.mobBase != null) {
this.healthMax = this.mobBase.getHealthMax();
this.manaMax = 0;
this.staminaMax = 0;
this.setHealth(this.healthMax);
this.mana.set(this.manaMax);
this.stamina.set(this.staminaMax);
}
if (this.parentZone.isPlayerCity())
if (NPC.GetNPCProfits(this) == null)
NPCProfits.CreateProfits(this);
//TODO set these correctly later
this.rangeHandOne = 8;
this.rangeHandTwo = -1;
this.minDamageHandOne = 1;
this.maxDamageHandOne = 4;
this.minDamageHandTwo = 1;
this.maxDamageHandTwo = 4;
this.atrHandOne = 300;
this.defenseRating = 200;
this.isActive = true;
this.charItemManager.load();
}
public MobBase getMobBase() {
return this.mobBase;
}

Loading…
Cancel
Save