diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 80964f71..9cf7a8ef 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -84,7 +84,7 @@ public class TangibleObject extends SWGObject implements Serializable { private transient TangibleMessageBuilder messageBuilder; //private TreeSet> lootSpecification = new TreeSet>(); - private List lootGroups = new ArrayList(); + private transient List lootGroups = new ArrayList(); @NotPersistent private transient boolean looted = false; // These 4 should not need to be persisted, since a looted corpse will get wiped with server restart @@ -507,13 +507,22 @@ public class TangibleObject extends SWGObject implements Serializable { public List getLootGroups() { return lootGroups; } + + public void setLootGroups(List lootGroups) { + this.lootGroups = lootGroups; + } public void addToLootGroups(String[] lootPoolNames, double[] lootPoolChances, double lootGroupChance) { - System.out.println("lootPoolNames[0] " + lootPoolNames[0]); + //System.out.println("lootPoolNames[0] " + lootPoolNames[0]); LootGroup lootGroup = new LootGroup(lootPoolNames, lootPoolChances, lootGroupChance); this.lootGroups.add(lootGroup); } + public void addToLootGroups(LootGroup lootGroup) { + this.lootGroups.add(lootGroup); + } + + public boolean isLooted() { return looted; } diff --git a/src/services/StaticService.java b/src/services/StaticService.java index dc302656..11b9dee8 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -36,6 +36,8 @@ import java.util.Map; import resources.common.FileUtilities; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; +import services.ai.AIActor; +import services.spawn.MobileTemplate; import main.NGECore; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.PortalVisitor; @@ -94,6 +96,11 @@ public class StaticService implements INetworkDispatch { } public SWGObject spawnObject(String template, String planetName, long cellId, float x, float y, float z, float qW, float qX, float qY, float qZ) { + return spawnObject(template, planetName, cellId, x, y, z, qW, qX, qY, qZ, -1); + } + + + public SWGObject spawnObject(String template, String planetName, long cellId, float x, float y, float z, float qW, float qX, float qY, float qZ, int respawnTime) { Planet planet = core.terrainService.getPlanetByName(planetName); if (planet == null) { @@ -113,10 +120,22 @@ public class StaticService implements INetworkDispatch { long objectId = core.objectService.getDOId(planetName, template, 0, buildingId, cellNumber, x, y, z); - SWGObject object; + SWGObject object = null; + MobileTemplate mobileTemplate = core.spawnService.getMobileTemplate(template); - if (core.spawnService.getMobileTemplate(template) != null) { - object = core.spawnService.spawnCreature(template, objectId, planetName, cellId, x, y, z, qW, qX, qY, qZ, (short) -1); + if (mobileTemplate != null) { + if(respawnTime > 0) { + try { + MobileTemplate clone = (MobileTemplate) mobileTemplate.clone(); + object = core.spawnService.spawnCreature(template, objectId, planetName, cellId, x, y, z, qW, qX, qY, qZ, (short) -1); + clone.setRespawnTime(respawnTime); + ((AIActor) object.getAttachment("AI")).setMobileTemplate(clone); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + } else { + object = core.spawnService.spawnCreature(template, objectId, planetName, cellId, x, y, z, qW, qX, qY, qZ, (short) -1); + } } else { object = core.objectService.createObject(template, objectId, planet, new Point3D(x, y, z), new Quaternion(qW, qX, qY, qZ), null, true, true); } diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index 9c2d639f..8ea09061 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -214,9 +214,9 @@ public class BaseSWGCommand implements Cloneable { this.commandCRC = commandCRC; } - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } public boolean isGmCommand() { return (godLevel > 0); diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 697530b6..74762ebd 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -128,7 +128,7 @@ public class HousingService implements INetworkDispatch { String playerFirstName = actor.getCustomName().split(" ")[0]; if (sign != null) { - sign.setCustomName2(playerFirstName + "'s House"); + sign.setCustomName(playerFirstName + "'s House"); } //building.add(sign); @@ -168,7 +168,8 @@ public class HousingService implements INetworkDispatch { } } - //core.objectService.persistObject(building.getObjectID(), building, core.getSWGObjectODB()); + core.objectService.persistObject(building.getObjectID(), building, core.getSWGObjectODB()); + core.getSWGObjectODB().getEnvironment().sync(); } diff --git a/src/services/spawn/MobileTemplate.java b/src/services/spawn/MobileTemplate.java index b18fc43e..18505f7d 100644 --- a/src/services/spawn/MobileTemplate.java +++ b/src/services/spawn/MobileTemplate.java @@ -21,12 +21,14 @@ ******************************************************************************/ package services.spawn; +import java.util.List; import java.util.Vector; import resources.datatables.Options; import resources.datatables.PvpStatus; +import resources.loot.LootGroup; -public class MobileTemplate { +public class MobileTemplate implements Cloneable { private Vector templates; private int optionBitmask = Options.ATTACKABLE; @@ -57,6 +59,8 @@ public class MobileTemplate { private String meatType, milkType, boneType, hideType; private int meatAmount, milkAmount, boneAmount, hideAmount; private int respawnTime = 0; + private List lootGroups; + public Vector getTemplates() { return templates; @@ -337,5 +341,23 @@ public class MobileTemplate { public void setRespawnTime(int respawnTime) { this.respawnTime = respawnTime; } + + public List getLootGroups() { + return lootGroups; + } + + public void setLootGroups(List lootGroups) { + this.lootGroups = lootGroups; + } + + public void addToLootGroups(String[] lootPoolNames, double[] lootPoolChances, double lootGroupChance) { + //System.out.println("lootPoolNames[0] " + lootPoolNames[0]); + LootGroup lootGroup = new LootGroup(lootPoolNames, lootPoolChances, lootGroupChance); + this.lootGroups.add(lootGroup); + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index f8817448..2d30d0c3 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -100,6 +100,9 @@ public class SpawnService { creature.setWeaponId(mobileTemplate.getCustomWeapon().getObjectID()); }*/ + if(mobileTemplate.getLootGroups() != null) + creature.setLootGroups(mobileTemplate.getLootGroups()); + creature.setOptionsBitmask(mobileTemplate.getOptionBitmask()); creature.setPvPBitmask(mobileTemplate.getPvpBitmask()); creature.setStfFilename("mob/creature_names"); // TODO: set other STFs for NPCs other than creatures