diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index fe25b6efc..fd7c6e8e3 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 076eea682..386a61ef8 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -8,7 +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; @@ -56,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; } @@ -184,6 +198,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/CoreManager.java b/src/services/CoreManager.java index 6afe85460..e612b0c8d 100644 --- a/src/services/CoreManager.java +++ b/src/services/CoreManager.java @@ -18,7 +18,7 @@ import services.galaxy.GalacticManager; public class CoreManager extends Manager { - private static final int galaxyId = 2; + private static final int galaxyId = 1; private EngineManager engineManager; private GalacticManager galacticManager; diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 1e2d9278c..5cf7638c4 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -27,6 +27,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; @@ -88,7 +91,7 @@ public class ObjectManager extends Manager { double loadTime = (System.nanoTime() - startLoad) / 1E6; System.out.printf("ObjectManager: Finished loading %d objects. Time: %fms%n", objects.size(), loadTime); clientFac = new ClientFactory(); - + return super.initialize(); } @@ -176,11 +179,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) { @@ -212,14 +236,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!"); } - creature.setOwner(player); - player.setCreatureObject(creature); - for (SWGObject obj : creature.getChildren()) { - if (obj instanceof PlayerObject) { - player.setPlayerObject(obj); - obj.setOwner(player); - 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..613d787c6 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(); } @@ -144,29 +143,39 @@ 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()); + TangibleObject hairObj = (TangibleObject) objManager.createObject(ClientFactory.formatToSharedFile(create.getHair())); hairObj.setAppearanceData(create.getHairCustomization()); - creatureObj.addChild(hairObj); + creatureObj.setSlot("hair", hairObj); + creatureObj.addEquipment(hairObj); } + //createStarterClothing(objManager, creatureObj, create.getRace(), create.getClothes()); 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); + + creatureObj.addEquipment(inventory); + creatureObj.addEquipment(datapad); } private void setPlayerObjectValues(PlayerObject playerObj, ClientCreateCharacter create) { @@ -179,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"));