|  |  | @ -18,7 +18,6 @@ import engine.job.JobContainer; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.job.JobScheduler; |  |  |  | import engine.job.JobScheduler; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.jobs.UpgradeNPCJob; |  |  |  | import engine.jobs.UpgradeNPCJob; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.math.Bounds; |  |  |  | import engine.math.Bounds; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.math.Quaternion; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.math.Vector3f; |  |  |  | import engine.math.Vector3f; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.math.Vector3fImmutable; |  |  |  | import engine.math.Vector3fImmutable; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.net.ByteBufferWriter; |  |  |  | import engine.net.ByteBufferWriter; | 
			
		
	
	
		
		
			
				
					|  |  | @ -108,7 +107,6 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.parentZone = parent; |  |  |  |         this.parentZone = parent; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.parentZoneID = parent.getObjectUUID(); |  |  |  |         this.parentZoneID = parent.getObjectUUID(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         clearStatic(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET; |  |  |  |         this.dbID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.currentID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET; |  |  |  |         this.currentID = MBServerStatics.NO_DB_ROW_ASSIGNED_YET; | 
			
		
	
	
		
		
			
				
					|  |  | @ -139,9 +137,6 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.parentZone = parent; |  |  |  |         this.parentZone = parent; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.dbID = newUUID; |  |  |  |         this.dbID = newUUID; | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.currentID = newUUID; |  |  |  |         this.currentID = newUUID; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         initializeNPC(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         clearStatic(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     /** |  |  |  |     /** | 
			
		
	
	
		
		
			
				
					|  |  | @ -246,12 +241,6 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |             e.printStackTrace(); |  |  |  |             e.printStackTrace(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             initializeNPC(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } catch (Exception e) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             Logger.error("NPC: " + this.dbID + " :" + e); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static boolean ISWallArcher(Contract contract) { |  |  |  |     public static boolean ISWallArcher(Contract contract) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -750,19 +739,8 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return currentID; |  |  |  |         return currentID; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private void clearStatic() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.parentZone = null; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.statLat = 0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.statLon = 0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.statAlt = 0f; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     private void initializeNPC() { |  |  |  |     private void initializeNPC() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         int slot; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Vector3fImmutable slotLocation; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Quaternion slotRotation; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (ConfigManager.serverType.equals(ServerType.LOGINSERVER)) |  |  |  |         if (ConfigManager.serverType.equals(ServerType.LOGINSERVER)) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -841,10 +819,6 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return this.contract; |  |  |  |         return this.contract; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     /* |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |      * Serialization |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     public int getContractID() { |  |  |  |     public int getContractID() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (this.contract != null) |  |  |  |         if (this.contract != null) | 
			
		
	
	
		
		
			
				
					|  |  | @ -1107,14 +1081,65 @@ public class NPC extends AbstractCharacter { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (ConfigManager.serverType.equals(ServerType.LOGINSERVER)) |  |  |  |         if (ConfigManager.serverType.equals(ServerType.LOGINSERVER)) | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         // Configure parent zone adding this NPC to the
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // zone collection
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.equip = loadEquipmentSet(this.equipmentSetID); |  |  |  |         this.parentZone = ZoneManager.getZoneByUUID(this.parentZoneID); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         this.parentZone.zoneNPCSet.remove(this); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         this.parentZone.zoneNPCSet.add(this); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         } catch (Exception e) { |  |  |  |         // Setup location for this NPC
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             Logger.error(e.getMessage()); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         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(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         this.equip = loadEquipmentSet(this.equipmentSetID); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (this.equip == null) |  |  |  |         if (this.equip == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |             this.equip = new HashMap<>(); |  |  |  |             this.equip = new HashMap<>(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |