diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index ea3021af6..d86d22e6c 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -8,6 +8,7 @@ import resources.Race; import resources.collections.SWGList; import resources.encodables.player.Equipment; import resources.network.BaselineBuilder; +import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.player.Player; import utilities.Encoder.StringType; @@ -184,6 +185,10 @@ public class CreatureObject extends TangibleObject { return difficulty; } + public PlayerObject getPlayerObject() { + return (PlayerObject) (hasSlot("ghost") ? getSlottedObject("ghost") : null); + } + public boolean isBeast() { return beast; } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 98c3cb4c8..f3365c158 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -23,6 +23,9 @@ import resources.Race; import resources.Terrain; import resources.client_info.ClientFactory; import resources.client_info.visitors.ObjectData; +import resources.client_info.visitors.SlotArrangementData; +import resources.client_info.visitors.SlotDefinitionData; +import resources.client_info.visitors.SlotDescriptorData; import resources.control.Intent; import resources.control.Manager; import resources.objects.SWGObject; @@ -80,7 +83,7 @@ public class ObjectManager extends Manager { }); clientFac = new ClientFactory(); - + return super.initialize(); } @@ -136,11 +139,32 @@ public class ObjectManager extends Manager { } private void addObjectAttributes(SWGObject obj, String template) { - ObjectData attributes = (ObjectData) clientFac.getInfoFromFile(ClientFactory.formatToSharedFile(template)); - obj.setStf((String) attributes.getAttribute("objectName")); - obj.setDetailStf((String) attributes.getAttribute("detailedDescription")); + obj.setStf((String) attributes.getAttribute(ObjectData.OBJ_STF)); + obj.setDetailStf((String) attributes.getAttribute(ObjectData.DETAIL_STF)); + obj.setVolume((Integer) attributes.getAttribute(ObjectData.VOLUME_LIMIT)); + + addSlotsToObject(obj, attributes); + } + + private void addSlotsToObject(SWGObject obj, ObjectData attributes) { + + if ((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR) != null) { + // TODO: These are the slots that the object HAS + SlotDescriptorData descriptor = (SlotDescriptorData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR)); + + for (String slotName : descriptor.getSlots()) { + obj.addObjectSlot(slotName, null); + } + } + + if ((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE) != null) { + // This is what slots the object *USES* + SlotArrangementData arrangementData = (SlotArrangementData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE)); + + obj.setArrangment(arrangementData.getArrangement()); + } } private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) { @@ -172,12 +196,10 @@ public class ObjectManager extends Manager { System.err.println("ObjectManager: Failed to start zone - CreatureObject could not be fetched from database"); throw new NullPointerException("CreatureObject for ID: " + characterId + " cannot be null!"); } - player.setCreatureObject(creature); - for (SWGObject obj : creature.getChildren()) { - if (obj instanceof PlayerObject) { - player.setPlayerObject(obj); - break; - } + player.setCreatureObject(creature); // CreatureObject contains the player object! + + if (player.getPlayerObject() == null) { + System.err.println("FATAL: " + player.getUsername() + "'s CreatureObject has a null ghost!"); } } diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index 3864fb57e..fb58b86e9 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -144,29 +144,34 @@ public class ZoneService extends Service { creatureObj.setVolume(0x000F4240); PlayerObject playerObj = (PlayerObject) objManager.createObject("object/player/shared_player.iff"); //WeaponObject defaultWeap = (WeaponObject) objManager.createObject("object/weapon/melee/unarmed/shared_unarmed_default_player.iff"); - setCreatureObjectValues(creatureObj, create); + setCreatureObjectValues(objManager, creatureObj, create); setPlayerObjectValues(playerObj, create); playerObj.setTag(player.getAccessLevel()); - creatureObj.addChild(playerObj); if (!create.getHair().isEmpty()) { TangibleObject hairObj = (TangibleObject) objManager.createObject(create.getHair()); hairObj.setAppearanceData(create.getHairCustomization()); - creatureObj.addChild(hairObj); + creatureObj.setSlot("hair", hairObj); } creatureObj.setLocation(start); playerObj.setLocation(start); player.setCreatureObject(creatureObj); - player.setPlayerObject(playerObj); + + creatureObj.setSlot("ghost", playerObj); return creatureObj.getObjectId(); } - private void setCreatureObjectValues(CreatureObject creatureObj, ClientCreateCharacter create) { + private void setCreatureObjectValues(ObjectManager objManager, CreatureObject creatureObj, ClientCreateCharacter create) { + TangibleObject inventory = (TangibleObject) objManager.createObject("object/tangible/inventory/shared_character_inventory.iff"); + TangibleObject datapad = (TangibleObject) objManager.createObject("object/tangible/datapad/shared_character_datapad.iff"); + creatureObj.setRace(Race.getRaceByFile(create.getRace())); creatureObj.setAppearanceData(create.getCharCustomization()); creatureObj.setHeight(create.getHeight()); creatureObj.setName(create.getName()); creatureObj.setPvpType(20); creatureObj.getSkills().add("species_" + creatureObj.getRace().getSpecies()); + creatureObj.setSlot("inventory", inventory); + creatureObj.setSlot("datapad", datapad); } private void setPlayerObjectValues(PlayerObject playerObj, ClientCreateCharacter create) {