diff --git a/PSWGCommon b/PSWGCommon index 3934cc12a..9236f68e5 160000 --- a/PSWGCommon +++ b/PSWGCommon @@ -1 +1 @@ -Subproject commit 3934cc12aa8c83a4467f22a19345daa4d207ae56 +Subproject commit 9236f68e56b6bc2412c3625f046d53e88b899c10 diff --git a/src/main/java/com/projectswg/holocore/resources/objects/tangible/TangibleObject.java b/src/main/java/com/projectswg/holocore/resources/objects/tangible/TangibleObject.java index cbf680934..dc0e77ce7 100644 --- a/src/main/java/com/projectswg/holocore/resources/objects/tangible/TangibleObject.java +++ b/src/main/java/com/projectswg/holocore/resources/objects/tangible/TangibleObject.java @@ -30,6 +30,8 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.util.Set; +import com.projectswg.common.data.customization.CustomizationString; +import com.projectswg.common.data.customization.CustomizationVariable; import com.projectswg.common.data.encodables.tangible.PvpFaction; import com.projectswg.common.data.encodables.tangible.PvpFlag; import com.projectswg.common.data.encodables.tangible.PvpStatus; @@ -49,7 +51,7 @@ import com.projectswg.holocore.resources.player.Player; public class TangibleObject extends SWGObject { - private byte [] appearanceData = new byte[0]; + private CustomizationString appearanceData = new CustomizationString(); private int maxHitPoints = 1000; private int components = 0; private boolean inCombat = false; @@ -83,10 +85,6 @@ public class TangibleObject extends SWGObject { inCombat = false; } - public byte [] getAppearanceData() { - return appearanceData; - } - public int getMaxHitPoints() { return maxHitPoints; } @@ -153,8 +151,18 @@ public class TangibleObject extends SWGObject { return objectEffects; } - public void setAppearanceData(byte [] appearanceData) { + public void putCustomization(String name, CustomizationVariable value) { + appearanceData.put(name, value); + } + + public CustomizationVariable getCustomization(String name) { + return appearanceData.get(name); + } + + public void setAppearanceData(CustomizationString appearanceData) { this.appearanceData = appearanceData; + + sendDelta(3, 6, appearanceData); } public void setMaxHitPoints(int maxHitPoints) { @@ -330,7 +338,7 @@ public class TangibleObject extends SWGObject { super.createBaseline3(target, bb); // 4 variables - BASE3 (4) bb.addInt(pvpFaction.getCrc()); // Faction - 4 bb.addInt(pvpStatus.getValue()); // Faction Status - 5 - bb.addArray(appearanceData); // - 6 + bb.addObject(appearanceData); // - 6 bb.addInt(0); // Component customization (Set, Integer) - 7 bb.addInt(0); bb.addInt(optionFlags); // 8 @@ -362,7 +370,7 @@ public class TangibleObject extends SWGObject { super.parseBaseline3(buffer); pvpFaction = PvpFaction.getFactionForCrc(buffer.getInt()); pvpStatus = PvpStatus.getStatusForValue(buffer.getInt()); - appearanceData = buffer.getArray(); + appearanceData.decode(buffer); SWGSet.getSwgSet(buffer, 3, 7, Integer.class); optionFlags = buffer.getInt(); buffer.getInt(); @@ -393,7 +401,7 @@ public class TangibleObject extends SWGObject { public void save(NetBufferStream stream) { super.save(stream); stream.addByte(0); - stream.addArray(appearanceData); + appearanceData.save(stream); stream.addInt(maxHitPoints); stream.addInt(components); stream.addBoolean(inCombat); @@ -414,7 +422,7 @@ public class TangibleObject extends SWGObject { public void read(NetBufferStream stream) { super.read(stream); stream.getByte(); - appearanceData = stream.getArray(); + appearanceData.read(stream); maxHitPoints = stream.getInt(); components = stream.getInt(); inCombat = stream.getBoolean(); diff --git a/src/main/java/com/projectswg/holocore/services/objects/StaticItemService.java b/src/main/java/com/projectswg/holocore/services/objects/StaticItemService.java index 07124af5d..09894dc71 100644 --- a/src/main/java/com/projectswg/holocore/services/objects/StaticItemService.java +++ b/src/main/java/com/projectswg/holocore/services/objects/StaticItemService.java @@ -33,6 +33,7 @@ import java.util.Map; import com.projectswg.common.control.Service; import com.projectswg.common.data.combat.DamageType; +import com.projectswg.common.data.customization.CustomizationVariable; import com.projectswg.common.data.info.RelationalServerData; import com.projectswg.common.data.info.RelationalServerFactory; import com.projectswg.common.data.swgfile.ClientFactory; @@ -47,6 +48,7 @@ import com.projectswg.holocore.resources.config.ConfigFile; import com.projectswg.holocore.resources.containers.ContainerPermissionsType; import com.projectswg.holocore.resources.objects.SWGObject; import com.projectswg.holocore.resources.objects.creature.CreatureObject; +import com.projectswg.holocore.resources.objects.tangible.TangibleObject; import com.projectswg.holocore.resources.objects.weapon.WeaponObject; import com.projectswg.holocore.resources.objects.weapon.WeaponType; import com.projectswg.holocore.resources.player.Player; @@ -335,8 +337,7 @@ public final class StaticItemService extends Service { private boolean wearableByRodians; private boolean wearableByTrandoshans; private boolean wearableByRest; - - // TODO customisation variables, ie. for colours + private int colorIndex; public WearableAttributes(String itemName, String iffTemplate) { super(itemName, iffTemplate); @@ -380,6 +381,7 @@ public final class StaticItemService extends Service { wearableByRodians = resultSet.getInt("race_rodian") != 0; wearableByTrandoshans = resultSet.getInt("race_trandoshan") != 0; wearableByRest = resultSet.getInt("race_rest") != 0; + colorIndex = resultSet.getInt("index_color"); return true; } @@ -402,6 +404,15 @@ public final class StaticItemService extends Service { // Add the race restrictions only if there are any if (!wearableByWookiees || !wearableByIthorians || !wearableByRodians || !wearableByTrandoshans || !wearableByRest) object.addAttribute("species_restrictions.species_name", buildRaceRestrictionString()); + + if (colorIndex != 0 && object instanceof TangibleObject) { + CustomizationVariable color = new CustomizationVariable(); + + color.setValue(colorIndex); + + ((TangibleObject) object).putCustomization("/private/index_color_1", color); + // TODO our item SDB has no way of defining multiple colors for a single item + } } private String buildRaceRestrictionString() { diff --git a/src/main/java/com/projectswg/holocore/services/player/creation/CharacterCreation.java b/src/main/java/com/projectswg/holocore/services/player/creation/CharacterCreation.java index 51f0beac7..85cdeb619 100644 --- a/src/main/java/com/projectswg/holocore/services/player/creation/CharacterCreation.java +++ b/src/main/java/com/projectswg/holocore/services/player/creation/CharacterCreation.java @@ -28,6 +28,7 @@ package com.projectswg.holocore.services.player.creation; import java.util.Calendar; +import com.projectswg.common.data.customization.CustomizationString; import com.projectswg.common.data.encodables.tangible.PvpFlag; import com.projectswg.common.data.encodables.tangible.Race; import com.projectswg.common.data.swgfile.ClientFactory; @@ -135,7 +136,7 @@ public class CharacterCreation { return createTangible(container, ContainerPermissionsType.INVENTORY, template); } - private void createHair(CreatureObject creatureObj, String hair, byte [] customization) { + private void createHair(CreatureObject creatureObj, String hair, CustomizationString customization) { if (hair.isEmpty()) return; TangibleObject hairObj = createDefaultObject(creatureObj, ClientFactory.formatToSharedFile(hair));