From 92fcafe2eb46e04b23da82e19ceb17854ac0211a Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sat, 13 Dec 2014 19:53:21 -0500 Subject: [PATCH 1/3] New objects are now created with their appropriate slots --- src/services/objects/ObjectManager.java | 44 +++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 98c3cb4c..694e012c 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -5,9 +5,11 @@ import intents.swgobject_events.SWGObjectEventIntent; import intents.swgobject_events.SWGObjectMovedIntent; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import main.ProjectSWG; import network.packets.swg.zone.HeartBeatMessage; @@ -23,6 +25,10 @@ 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.containers.ObjectSlot; import resources.control.Intent; import resources.control.Manager; import resources.objects.SWGObject; @@ -80,7 +86,9 @@ public class ObjectManager extends Manager { }); clientFac = new ClientFactory(); - + // Load up the slot definitions to the datamap in clientFac so we don't have to load it later + SlotDefinitionData def = (SlotDefinitionData) clientFac.getInfoFromFile("abstract/slot/slot_definition/slot_definitions.iff"); + return super.initialize(); } @@ -136,11 +144,41 @@ public class ObjectManager extends Manager { } private void addObjectAttributes(SWGObject obj, String template) { + System.out.println("Adding attributes for template " + 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)); + + addSlotsToObject(obj, attributes); + } + + private void addSlotsToObject(SWGObject obj, ObjectData attributes) { + + if ((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR) != null) { + SlotDefinitionData slotDefs = (SlotDefinitionData) clientFac.getInfoFromFile("abstract/slot/slot_definition/slot_definitions.iff"); + + // TODO: These are the slots that the object HAS + System.out.println("SlotDescriptor: " + (String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR)); + SlotDescriptorData descriptor = (SlotDescriptorData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR)); + + for (String slotName : descriptor.getSlots()) { + System.out.println("Slot: " + slotName); + obj.addObjectSlot(new ObjectSlot(slotName)); + } + + + } + + if ((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE) != null) { + // This is what slots the object *USES* + System.out.println("Arrangement: " + (String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE)); + + SlotArrangementData arrangementData = (SlotArrangementData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE)); + + obj.setArrangment(arrangementData.getArrangement()); + } } private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) { From 96a44952cd1038aea756fca208ef743a645d8264 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 14 Dec 2014 10:52:47 -0500 Subject: [PATCH 2/3] Volume limit now set based on template files, Refactored zoning to account for ghost slot, Added inventory and datapad on creation --- .../objects/creature/CreatureObject.java | 5 ++++ src/services/objects/ObjectManager.java | 30 +++++-------------- src/services/player/ZoneService.java | 15 ++++++---- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index ea3021af..d86d22e6 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 694e012c..f3365c15 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -5,11 +5,9 @@ import intents.swgobject_events.SWGObjectEventIntent; import intents.swgobject_events.SWGObjectMovedIntent; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import main.ProjectSWG; import network.packets.swg.zone.HeartBeatMessage; @@ -28,7 +26,6 @@ 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.containers.ObjectSlot; import resources.control.Intent; import resources.control.Manager; import resources.objects.SWGObject; @@ -86,8 +83,6 @@ public class ObjectManager extends Manager { }); clientFac = new ClientFactory(); - // Load up the slot definitions to the datamap in clientFac so we don't have to load it later - SlotDefinitionData def = (SlotDefinitionData) clientFac.getInfoFromFile("abstract/slot/slot_definition/slot_definitions.iff"); return super.initialize(); } @@ -144,12 +139,11 @@ public class ObjectManager extends Manager { } private void addObjectAttributes(SWGObject obj, String template) { - System.out.println("Adding attributes for template " + template); - ObjectData attributes = (ObjectData) clientFac.getInfoFromFile(ClientFactory.formatToSharedFile(template)); 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); } @@ -157,24 +151,16 @@ public class ObjectManager extends Manager { private void addSlotsToObject(SWGObject obj, ObjectData attributes) { if ((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR) != null) { - SlotDefinitionData slotDefs = (SlotDefinitionData) clientFac.getInfoFromFile("abstract/slot/slot_definition/slot_definitions.iff"); - // TODO: These are the slots that the object HAS - System.out.println("SlotDescriptor: " + (String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR)); SlotDescriptorData descriptor = (SlotDescriptorData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.SLOT_DESCRIPTOR)); for (String slotName : descriptor.getSlots()) { - System.out.println("Slot: " + slotName); - obj.addObjectSlot(new ObjectSlot(slotName)); + obj.addObjectSlot(slotName, null); } - - } if ((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE) != null) { - // This is what slots the object *USES* - System.out.println("Arrangement: " + (String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE)); - + // This is what slots the object *USES* SlotArrangementData arrangementData = (SlotArrangementData) clientFac.getInfoFromFile((String) attributes.getAttribute(ObjectData.ARRANGEMENT_FILE)); obj.setArrangment(arrangementData.getArrangement()); @@ -210,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 3864fb57..fb58b86e 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) { From f98b18395835a043e81ec88e3b9d7eee0b519e7e Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 14 Dec 2014 12:00:29 -0500 Subject: [PATCH 3/3] Hair will now show on players, Added equipment and appearance list methods to CreatureObject --- .../encodables/player/Equipment.java | 3 ++- .../objects/creature/CreatureObject.java | 13 ++++++++++ src/services/player/ZoneService.java | 26 ++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index fe25b6ef..fd7c6e8e 100644 --- a/src/resources/encodables/player/Equipment.java +++ b/src/resources/encodables/player/Equipment.java @@ -8,7 +8,8 @@ import resources.network.BaselineBuilder.Encodable; import resources.objects.weapon.WeaponObject; public class Equipment implements Encodable { - + private static final long serialVersionUID = 1L; + private WeaponObject weapon; private byte[] customizationString; private int arrangementId = 4; diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index d86d22e6..d7431544 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -8,8 +8,10 @@ import resources.Race; import resources.collections.SWGList; import resources.encodables.player.Equipment; import resources.network.BaselineBuilder; +import resources.objects.SWGObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; +import resources.objects.weapon.WeaponObject; import resources.player.Player; import utilities.Encoder.StringType; @@ -57,6 +59,17 @@ public class CreatureObject extends TangibleObject { super(objectId); } + public void addEquipment(SWGObject obj) { + if (obj instanceof WeaponObject) + equipmentList.add(new Equipment((WeaponObject) obj)); + else + equipmentList.add(new Equipment(obj.getObjectId(), obj.getTemplate())); + } + + public void addAppearanceItem(SWGObject obj) { + appearanceList.add(new Equipment(obj.getObjectId(), obj.getTemplate())); + } + public SWGList getEquipmentList() { return equipmentList; } diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index fb58b86e..613d787c 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -7,6 +7,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Calendar; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import main.ProjectSWG; import network.packets.Packet; @@ -39,7 +40,6 @@ import resources.control.Service; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; -import resources.player.AccessLevel; import resources.player.Player; import resources.player.PlayerEvent; import resources.services.Config; @@ -57,7 +57,6 @@ public class ZoneService extends Service { public ZoneService() { nameGenerator = new SWGNameGenerator(); clientFac = new ClientFactory(); - //profTemplates = new HashMap(); } @Override @@ -65,7 +64,7 @@ public class ZoneService extends Service { String createCharacterSql = "INSERT INTO characters (id, name, race, userId, galaxyId) VALUES (?, ?, ?, ?, ?)"; createCharacter = getLocalDatabase().prepareStatement(createCharacterSql); nameGenerator.loadAllRules(); - //loadProfTemplates(); TODO: Uncomment when object creation is implemented + //loadProfTemplates(); return super.initialize(); } @@ -148,10 +147,12 @@ public class ZoneService extends Service { setPlayerObjectValues(playerObj, create); playerObj.setTag(player.getAccessLevel()); if (!create.getHair().isEmpty()) { - TangibleObject hairObj = (TangibleObject) objManager.createObject(create.getHair()); + TangibleObject hairObj = (TangibleObject) objManager.createObject(ClientFactory.formatToSharedFile(create.getHair())); hairObj.setAppearanceData(create.getHairCustomization()); creatureObj.setSlot("hair", hairObj); + creatureObj.addEquipment(hairObj); } + //createStarterClothing(objManager, creatureObj, create.getRace(), create.getClothes()); creatureObj.setLocation(start); playerObj.setLocation(start); player.setCreatureObject(creatureObj); @@ -172,6 +173,9 @@ public class ZoneService extends Service { creatureObj.getSkills().add("species_" + creatureObj.getRace().getSpecies()); creatureObj.setSlot("inventory", inventory); creatureObj.setSlot("datapad", datapad); + + creatureObj.addEquipment(inventory); + creatureObj.addEquipment(datapad); } private void setPlayerObjectValues(PlayerObject playerObj, ClientCreateCharacter create) { @@ -184,7 +188,21 @@ public class ZoneService extends Service { sendPacket(player, new GalaxyLoopTimesResponse(ProjectSWG.getCoreTime()/1000)); } + @SuppressWarnings("unused") + private void createStarterClothing(ObjectManager objManager, CreatureObject player, String race, String profession) { + TangibleObject inventory = (TangibleObject) player.getSlottedObject("inventory"); + + for (String template : profTemplates.get(profession).getItems(ClientFactory.formatToSharedFile(race))) { + TangibleObject clothing = (TangibleObject) objManager.createObject(ClientFactory.formatToSharedFile(template)); + + inventory.addChild(clothing); + } + } + + @SuppressWarnings("unused") private void loadProfTemplates() { + profTemplates = new ConcurrentHashMap(); + profTemplates.put("crafting_artisan", (ProfTemplateData) clientFac.getInfoFromFile("creation/profession_defaults_combat_brawler.iff")); profTemplates.put("combat_brawler", (ProfTemplateData) clientFac.getInfoFromFile("creation/profession_defaults_combat_brawler.iff")); profTemplates.put("social_entertainer", (ProfTemplateData) clientFac.getInfoFromFile("creation/profession_defaults_social_entertainer.iff"));