diff --git a/scripts/commands/generic/cmdTip.py b/scripts/commands/generic/cmdTip.py index 8527a531a..25353f4bc 100644 --- a/scripts/commands/generic/cmdTip.py +++ b/scripts/commands/generic/cmdTip.py @@ -1,5 +1,4 @@ import sys def execute(objManager, player, target, args): - player.getPlayerObject().setExperience("entertainer", 13) return \ No newline at end of file diff --git a/scripts/commands/generic/setMoodInternal.py b/scripts/commands/generic/setMoodInternal.py new file mode 100644 index 000000000..2589b0f88 --- /dev/null +++ b/scripts/commands/generic/setMoodInternal.py @@ -0,0 +1,10 @@ +from intents.chat import SpatialChatIntent +import sys + +#Args: moodId +def execute(objManager, player, target, args): + if " " in args: + return + + player.getCreatureObject().setMoodId(int(args)) + return \ No newline at end of file diff --git a/scripts/commands/generic/setWaypointActiveStatus.py b/scripts/commands/generic/setWaypointActiveStatus.py new file mode 100644 index 000000000..b25d0d2b0 --- /dev/null +++ b/scripts/commands/generic/setWaypointActiveStatus.py @@ -0,0 +1,18 @@ +import sys + +def execute(objManager, player, target, args): + ghost = player.getPlayerObject() + if ghost is None: + return + + waypoint = ghost.getWaypoint(target.getObjectId()) + if waypoint is None: + return + + if waypoint.isActive(): + waypoint.setActive(False) + else: + waypoint.setActive(True) + + ghost.updateWaypoint(waypoint) + return \ No newline at end of file diff --git a/scripts/commands/generic/setWaypointName.py b/scripts/commands/generic/setWaypointName.py new file mode 100644 index 000000000..521e6af05 --- /dev/null +++ b/scripts/commands/generic/setWaypointName.py @@ -0,0 +1,15 @@ +import sys + +#Args: name +def execute(objManager, player, target, args): + ghost = player.getPlayerObject() + if ghost is None: + return + + waypoint = ghost.getWaypoint(target.getObjectId()) + if waypoint is None: + return + + waypoint.setName(args) + ghost.updateWaypoint(waypoint) + return \ No newline at end of file diff --git a/src/resources/commands/callbacks/AttributesCmdCallback.java b/src/resources/commands/callbacks/AttributesCmdCallback.java new file mode 100644 index 000000000..76467616a --- /dev/null +++ b/src/resources/commands/callbacks/AttributesCmdCallback.java @@ -0,0 +1,35 @@ +package resources.commands.callbacks; + +import java.util.Map; + +import network.packets.swg.zone.spatial.AttributeListMessage; +import resources.commands.ICmdCallback; +import resources.objects.SWGObject; +import resources.player.Player; +import services.objects.ObjectManager; + +public class AttributesCmdCallback implements ICmdCallback { + + @Override + public void execute(ObjectManager objManager, Player player, SWGObject target, String args) { + String[] cmd = args.split(" "); + + for (String s : cmd) { + if (s.equals("-255") || s.length() == 0) + continue; + + SWGObject obj = objManager.getObjectById(Long.valueOf(s)); + if (obj != null) + handleSendItemAttributes(obj, player); + } + } + + private void handleSendItemAttributes(SWGObject object, Player player) { + Map attributes = object.getAttributes(); + if (attributes.size() == 0) + attributes.put("", ""); + + AttributeListMessage message = new AttributeListMessage(object.getObjectId(), attributes); + player.sendPacket(message); + } +} diff --git a/src/resources/commands/callbacks/SocialInternalCmdCallback.java b/src/resources/commands/callbacks/SocialInternalCmdCallback.java new file mode 100644 index 000000000..1a87cb83f --- /dev/null +++ b/src/resources/commands/callbacks/SocialInternalCmdCallback.java @@ -0,0 +1,21 @@ +package resources.commands.callbacks; + +import resources.commands.ICmdCallback; +import resources.objects.SWGObject; +import resources.player.Player; +import services.objects.ObjectManager; + +public class SocialInternalCmdCallback implements ICmdCallback { + + @Override + public void execute(ObjectManager objManager, Player player, SWGObject target, String args) { + // Args: targetId (0), emoteId (1), unk1, unk2 + String[] cmd = args.split(" ", 3); + + if (!cmd[0].equals("0")) + target = objManager.getObjectById(Long.valueOf(cmd[0])); + + // TODO: Send ObjControllerMessage with PlayerEmote packet to observers + } + +} diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index ce8d27ffb..b27a6e5fc 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -22,10 +22,7 @@ public class CreatureObject extends TangibleObject { private static final long serialVersionUID = 1L; private Posture posture = Posture.STANDING; - private Race race = Race.HUMAN; - private int unmodifiedMaxAtributes = 0; - private int attributeBonus = 0; - private int shockWounds = 0; + private Race race = Race.HUMAN; private double movementScale = 1; private double movementPercent = 1; private double walkSpeed = 1.549; @@ -34,22 +31,36 @@ public class CreatureObject extends TangibleObject { private double accelPercent = 1; private double turnScale = 1; private double slopeModAngle = 1; - private double slopeModPercent = 1; + private double slopeModPercent = 1; private double waterModPercent = 0.75; private double height = 0; - private int performanceType = 0; - private int performanceStartTime = 0; private long performanceListenTarget = 0; private int guildId = 0; - private byte rank = 0; - private int level = 1; + private short level = 1; private int levelHealthGranted = 0; private int totalLevelXp = 0; private CreatureDifficulty difficulty = CreatureDifficulty.NORMAL; - private boolean beast = false; private int cashBalance = 0; private int bankBalance = 0; - + private String moodAnimation = "neutral"; + private String animation = ""; + private long equippedWeaponId = 0; + private byte moodId = 0; + private long lookAtTargetId = 0; + private long intendedTargetId = 0; + private int performanceCounter = 0; + private int performanceId = 0; + private String costume = ""; + private boolean visible = true; + private boolean performing = false; + private boolean shownOnRadar = true; + private boolean beast = false; + private long groupId = 0; + private byte factionRank = 0; + private long ownerId = 0; + private int battleFatigue = 0; + private long statesBitmask = 0; + private SWGList baseAttributes = new SWGList(BaselineType.CREO, 1, 2); private SWGList skills = new SWGList(BaselineType.CREO, 1, 3, false, StringType.ASCII); private SWGList hamEncumbList = new SWGList(BaselineType.CREO, 4, 10, true); @@ -62,7 +73,8 @@ public class CreatureObject extends TangibleObject { private SWGMap missionCriticalObjs = new SWGMap<>(BaselineType.CREO, 4, 21); private SWGMap abilities = new SWGMap<>(BaselineType.CREO, 4, 22, StringType.ASCII); private SWGMap buffs = new SWGMap<>(BaselineType.CREO, 6, 26); // TODO: Buff structure - + + public CreatureObject(long objectId) { super(objectId); initMaxAttributes(); @@ -113,18 +125,6 @@ public class CreatureObject extends TangibleObject { return race; } - public int getUnmodifiedMaxAtributes() { - return unmodifiedMaxAtributes; - } - - public int getAttributeBonus() { - return attributeBonus; - } - - public int getShockWounds() { - return shockWounds; - } - public double getMovementScale() { return movementScale; } @@ -169,14 +169,6 @@ public class CreatureObject extends TangibleObject { return height; } - public int getPerformanceType() { - return performanceType; - } - - public int getPerformanceStartTime() { - return performanceStartTime; - } - public long getPerformanceListenTarget() { return performanceListenTarget; } @@ -185,10 +177,6 @@ public class CreatureObject extends TangibleObject { return guildId; } - public byte getRank() { - return rank; - } - public int getLevel() { return level; } @@ -209,13 +197,9 @@ public class CreatureObject extends TangibleObject { return (PlayerObject) (hasSlot("ghost") ? getSlottedObject("ghost") : null); } - public boolean isBeast() { - return beast; - } - public void setPosture(Posture posture) { this.posture = posture; - sendDelta(3, 14, posture); + sendDelta(3, 14, posture.getId()); } public void setRace(Race race) { @@ -232,56 +216,54 @@ public class CreatureObject extends TangibleObject { sendDelta(1, 1, bankBalance); } - public void setUnmodifiedMaxAtributes(int unmodifiedMaxAtributes) { - this.unmodifiedMaxAtributes = unmodifiedMaxAtributes; - } - - public void setAttributeBonus(int attributeBonus) { - this.attributeBonus = attributeBonus; - } - - public void setShockWounds(int shockWounds) { - this.shockWounds = shockWounds; - } - public void setMovementScale(double movementScale) { this.movementScale = movementScale; + sendDelta(4, 12, movementScale); } public void setMovementPercent(double movementPercent) { this.movementPercent = movementPercent; + sendDelta(4, 13, movementPercent); } public void setWalkSpeed(double walkSpeed) { this.walkSpeed = walkSpeed; + sendDelta(4, 19, walkSpeed); } public void setRunSpeed(double runSpeed) { this.runSpeed = runSpeed; + sendDelta(4, 15, runSpeed); } public void setAccelScale(double accelScale) { this.accelScale = accelScale; + sendDelta(4, 8, accelScale); } public void setAccelPercent(double accelPercent) { this.accelPercent = accelPercent; + sendDelta(4, 9, accelPercent); } public void setTurnScale(double turnScale) { this.turnScale = turnScale; + sendDelta(4, 18, turnScale); } public void setSlopeModAngle(double slopeModAngle) { this.slopeModAngle = slopeModAngle; + sendDelta(4, 16, slopeModAngle); } public void setSlopeModPercent(double slopeModPercent) { this.slopeModPercent = slopeModPercent; + sendDelta(4, 17, slopeModPercent); } public void setWaterModPercent(double waterModPercent) { this.waterModPercent = waterModPercent; + sendDelta(4, 20, waterModPercent); } public void setHeight(double height) { @@ -289,46 +271,199 @@ public class CreatureObject extends TangibleObject { sendDelta(3, 17, height); } - public void setPerformanceType(int performanceType) { - this.performanceType = performanceType; - } - - public void setPerformanceStartTime(int performanceStartTime) { - this.performanceStartTime = performanceStartTime; - } - public void setPerformanceListenTarget(long performanceListenTarget) { this.performanceListenTarget = performanceListenTarget; + sendDelta(4, 14, performanceListenTarget); } public void setGuildId(int guildId) { this.guildId = guildId; + sendDelta(6, 15, guildId); } - public void setRank(byte rank) { - this.rank = rank; - } - - public void setLevel(int level) { + public void setLevel(short level) { this.level = level; + sendDelta(6, 8, level); } public void setLevelHealthGranted(int levelHealthGranted) { this.levelHealthGranted = levelHealthGranted; + sendDelta(6, 9, levelHealthGranted); } public void setTotalLevelXp(int totalLevelXp) { this.totalLevelXp = totalLevelXp; + sendDelta(4, 23, totalLevelXp); } public void setDifficulty(CreatureDifficulty difficulty) { this.difficulty = difficulty; + sendDelta(6, 26, difficulty.getDifficulty()); } + public String getMoodAnimation() { + return moodAnimation; + } + + public void setMoodAnimation(String moodAnimation) { + this.moodAnimation = moodAnimation; + sendDelta(6, 11, moodAnimation); + } + + public boolean isBeast() { + return beast; + } + public void setBeast(boolean beast) { this.beast = beast; + sendDelta(6, 31, beast); } - + + public String getAnimation() { + return animation; + } + + public void setAnimation(String animation) { + this.animation = animation; + sendDelta(6, 10, animation); + } + + public long getEquippedWeaponId() { + return equippedWeaponId; + } + + public void setEquippedWeaponId(long equippedWeaponId) { + this.equippedWeaponId = equippedWeaponId; + sendDelta(6, 12, equippedWeaponId); + } + + public byte getMoodId() { + return moodId; + } + + public void setMoodId(byte moodId) { + this.moodId = moodId; + sendDelta(6, 18, moodId); + } + + public long getLookAtTargetId() { + return lookAtTargetId; + } + + public void setLookAtTargetId(long lookAtTargetId) { + this.lookAtTargetId = lookAtTargetId; + sendDelta(6, 16, lookAtTargetId); + } + + public long getIntendedTargetId() { + return intendedTargetId; + } + + public void setIntendedTargetId(long intendedTargetId) { + this.intendedTargetId = intendedTargetId; + sendDelta(6, 17, intendedTargetId); + } + + public int getPerformanceCounter() { + return performanceCounter; + } + + public void setPerformanceCounter(int performanceCounter) { + this.performanceCounter = performanceCounter; + sendDelta(6, 19, performanceCounter); + } + + public int getPerformanceId() { + return performanceId; + } + + public void setPerformanceId(int performanceId) { + this.performanceId = performanceId; + sendDelta(6, 20, performanceId); + } + + public String getCostume() { + return costume; + } + + public void setCostume(String costume) { + this.costume = costume; + sendDelta(6, 24, costume); + } + + public long getGroupId() { + return groupId; + } + + public void setGroupId(long groupId) { + this.groupId = groupId; + sendDelta(6, 13, groupId); + } + + public byte getFactionRank() { + return factionRank; + } + + public void setFactionRank(byte factionRank) { + this.factionRank = factionRank; + sendDelta(3, 14, factionRank); + } + + public long getOwnerId() { + return ownerId; + } + + public void setOwnerId(long ownerId) { + this.ownerId = ownerId; + sendDelta(3, 15, ownerId); + } + + public int getBattleFatigue() { + return battleFatigue; + } + + public void setBattleFatigue(int battleFatigue) { + this.battleFatigue = battleFatigue; + sendDelta(3, 17, battleFatigue); + } + + public long getStatesBitmask() { + return statesBitmask; + } + + public void setStatesBitmask(long statesBitmask) { + this.statesBitmask = statesBitmask; + sendDelta(3, 18, statesBitmask); + + } + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + sendDelta(6, 25, visible); + } + + public boolean isPerforming() { + return performing; + } + + public void setPerforming(boolean performing) { + this.performing = performing; + sendDelta(6, 27, performing); + } + + public boolean isShownOnRadar() { + return shownOnRadar; + } + + public void setShownOnRadar(boolean shownOnRadar) { + this.shownOnRadar = shownOnRadar; + sendDelta(6, 30, shownOnRadar); + } + public int getHealth() { return attributes.get(0); } @@ -470,11 +605,11 @@ public class CreatureObject extends TangibleObject { public void createBaseline3(Player target, BaselineBuilder bb) { super.createBaseline3(target, bb); // 13 variables - TANO3 (9) + BASE3 (4) bb.addByte(posture.getId()); // 13 - bb.addByte(0); // Faction Rank -- 14 - bb.addLong(0); // Owner - mainly used for pets and vehicles -- 15 + bb.addByte(factionRank); // 14 + bb.addLong(ownerId); // 15 bb.addFloat((float) height); // 16 - bb.addInt(0); // Battle Fatigue -- 17 - bb.addLong(0); // States Bitmask -- 18 + bb.addInt(battleFatigue); // 17 + bb.addLong(statesBitmask); // 18 bb.incremeantOperandCount(6); } @@ -487,7 +622,7 @@ public class CreatureObject extends TangibleObject { bb.addObject(skillMods); // 11 bb.addFloat((float) movementScale); // 12 bb.addFloat((float) movementPercent); // 13 - bb.addLong(0); // Listen to ID - 14 + bb.addLong(performanceListenTarget); // 14 bb.addFloat((float) runSpeed); // 15 bb.addFloat((float) slopeModAngle); // 16 bb.addFloat((float) slopeModPercent); // 17 @@ -496,7 +631,7 @@ public class CreatureObject extends TangibleObject { bb.addFloat((float) waterModPercent); // 20 bb.addObject(missionCriticalObjs); // 21 bb.addObject(abilities); // 22 - bb.addInt(0); // XP Display Counter (remaining experience to next level up, updates the experience bar on client) - 23 + bb.addInt(totalLevelXp); // 23 bb.incremeantOperandCount(16); } @@ -504,31 +639,31 @@ public class CreatureObject extends TangibleObject { public void createBaseline6(Player target, BaselineBuilder bb) { super.createBaseline6(target, bb); // 8 variables - TANO6 (6) + BASE6 (2) bb.addShort(level); // 8 - bb.addInt(0); // Granted Health -- 9 - bb.addAscii(""); // Current Animation -- 10 - bb.addAscii("neutral"); // Animation Mood -- 11 - bb.addLong(0); // Weapon ID -- 12 - bb.addLong(0); // Group ID -- 13 + bb.addInt(levelHealthGranted); // 9 + bb.addAscii(animation); // 10 + bb.addAscii(moodAnimation); // 11 + bb.addLong(equippedWeaponId); // 12 + bb.addLong(groupId); // 13 bb.addLong(0); // Group Inviter ID -- 14 bb.addAscii(""); // Group Inviter Name bb.addLong(0); // Invite counter - bb.addInt(0); // Guild ID -- 15 - bb.addLong(0); // Look-at Target ID -- 16 - bb.addLong(0); // Intended ID -- 17 - bb.addByte(0); // Mood ID -- 18 - bb.addInt(0); // Performance Counter -- 19 - bb.addInt(0); // Performance ID -- 20 + bb.addInt(guildId); // 15 + bb.addLong(lookAtTargetId); // 16 + bb.addLong(intendedTargetId); // 17 + bb.addByte(moodId); // 18 + bb.addInt(performanceCounter); // 19 + bb.addInt(performanceId); // 20 bb.addObject(attributes); // 21 bb.addObject(maxAttributes); // 22 bb.addObject(equipmentList); // 23 - bb.addAscii(""); // Appearance (costume) -- 24 - bb.addBoolean(true); // Visible -- 25 + bb.addAscii(costume); // 24 + bb.addBoolean(visible); // 25 bb.addObject(buffs); // 26 - bb.addBoolean(false); // Is Performing -- 27 + bb.addBoolean(performing); // 27 bb.addByte(difficulty.getDifficulty()); // 28 bb.addInt(-1); // Hologram Color -- 29 - bb.addBoolean(true); // Visible On Radar -- 30 - bb.addBoolean(false); // Is Pet -- 31 + bb.addBoolean(shownOnRadar); // 30 + bb.addBoolean(beast); // 31 bb.addByte(0); // Unknown -- 32 bb.addObject(appearanceList); // 33 bb.addLong(0); // unknown -- 34 diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index 37c25213a..49c155fd1 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -42,6 +42,25 @@ public class PlayerObject extends IntangibleObject { } } + public WaypointObject getWaypoint(long objId) { + synchronized(waypoints) { + return waypoints.get(objId); + } + } + + public void updateWaypoint(WaypointObject obj) { + synchronized(waypoints) { + waypoints.update(obj.getObjectId(), this); + } + } + + public void removeWaypoint(long objId) { + synchronized(waypoints) { + waypoints.remove(objId); + waypoints.sendDeltaMessage(this); + } + } + public void setExperience(String type, int value) { experience.put(type, value); experience.sendDeltaMessage(this); diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 8749459ec..7a4756dfe 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -14,7 +14,6 @@ public class TangibleObject extends SWGObject { private int damageTaken = 0; private int maxHitPoints = 0; private int components = 0; - private boolean visible = true; private boolean inCombat = false; private int condition = 0; private int pvpFlags = 0; @@ -43,10 +42,6 @@ public class TangibleObject extends SWGObject { return components; } - public boolean isVisible() { - return visible; - } - public boolean isInCombat() { return inCombat; } @@ -91,10 +86,6 @@ public class TangibleObject extends SWGObject { this.components = components; } - public void setVisible(boolean visible) { - this.visible = visible; - } - public void setInCombat(boolean inCombat) { this.inCombat = inCombat; } diff --git a/src/resources/objects/waypoint/WaypointObject.java b/src/resources/objects/waypoint/WaypointObject.java index 1786fb012..7662bd402 100644 --- a/src/resources/objects/waypoint/WaypointObject.java +++ b/src/resources/objects/waypoint/WaypointObject.java @@ -4,7 +4,6 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import resources.common.CRC; -import resources.network.BaselineBuilder; import resources.network.BaselineBuilder.Encodable; import resources.objects.intangible.IntangibleObject; import resources.player.Player; @@ -15,7 +14,6 @@ public class WaypointObject extends IntangibleObject implements Encodable{ private static final long serialVersionUID = 1L; private int cellNumber; - private long targetId = 0; private String name = "New Waypoint"; private WaypointColor color = WaypointColor.BLUE; private boolean active = true; @@ -34,17 +32,6 @@ public class WaypointObject extends IntangibleObject implements Encodable{ this.cellNumber = cellNumber; } - - public long getTargetId() { - return targetId; - } - - - public void setTargetId(long targetId) { - this.targetId = targetId; - } - - public String getName() { return name; } @@ -74,34 +61,10 @@ public class WaypointObject extends IntangibleObject implements Encodable{ this.active = active; } - - public void createBaseline3(Player target, BaselineBuilder bb) { - super.createBaseline3(target, bb); - bb.addInt(cellNumber); - bb.addFloat((float) getLocation().getX()); - bb.addFloat((float) getLocation().getY()); - bb.addFloat((float) getLocation().getZ()); - bb.addLong(targetId); // unsure when this is anything but 0, have yet to see it change - bb.addInt(getLocation().getTerrain().getCrc()); - bb.addUnicode(name); - bb.addByte(color.getValue()); - bb.addBoolean(active); - } - protected void createObject(Player target) { // NOTE: Client is never sent a WAYP baseline in NGE, WaypointObject's just go inside the Waypoint List in PLAY. - - /*super.sendSceneCreateObject(target); - - BaselineBuilder bb = new BaselineBuilder(this, BaselineType.WAYP, 3); - createBaseline3(target, bb); - bb.sendTo(target); - - createChildrenObjects(target); - target.sendPacket(new SceneEndBaselines(getObjectId()));*/ } - @Override public byte[] encode() { ByteBuffer bb = ByteBuffer.allocate(42 + name.length() * 2).order(ByteOrder.LITTLE_ENDIAN); @@ -109,8 +72,8 @@ public class WaypointObject extends IntangibleObject implements Encodable{ bb.putFloat((float) getLocation().getX()); bb.putFloat((float) 0); bb.putFloat((float) getLocation().getZ()); - bb.putLong(targetId); // unsure when this is anything but 0, have yet to see it change - bb.putInt(CRC.getCrc("tatooine")); // TODO: Add method to terrain's to just get planet name instead of file name + bb.putLong(0); // Network id, used for clusters + bb.putInt(CRC.getCrc(getLocation().getTerrain().getName())); bb.put(Encoder.encodeUnicode(name)); bb.putLong(getObjectId()); bb.put((byte) color.getValue()); @@ -121,7 +84,7 @@ public class WaypointObject extends IntangibleObject implements Encodable{ public enum WaypointColor{ BLUE(1), GREEN(2), ORANGE(3), YELLOW(4), PURPLE(5), WHITE(6), MULTICOLOR(7); - int i; + private int i; private WaypointColor(int i) { this.i = i; diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index fd276ebd3..e021e1312 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -177,7 +177,7 @@ public class ChatService extends Service { private void handleInstantMessage(PlayerManager playerMgr, Player sender, ChatInstantMessageToCharacter request) { String strReceiver = request.getCharacter().toLowerCase(Locale.ENGLISH); - String strSender = sender.getCharacterName().toLowerCase(Locale.ENGLISH); + String strSender = sender.getCharacterName(); if (strSender.contains(" ")) strSender = strSender.split(" ")[0]; diff --git a/src/services/commands/CommandService.java b/src/services/commands/CommandService.java index ef6805050..2e61da692 100644 --- a/src/services/commands/CommandService.java +++ b/src/services/commands/CommandService.java @@ -122,5 +122,7 @@ public class CommandService extends Service { registerCallback("waypoint", new WaypointCmdCallback()); registerCallback("requestWaypointAtPosition", new RequestWaypointCmdCallback()); registerCallback("server", new ServerCmdCallback()); + registerCallback("getAttributesBatch", new AttributesCmdCallback()); + registerCallback("socialInternal", new SocialInternalCmdCallback()); } } diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index 33b868049..a3efdfba0 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -30,6 +30,7 @@ import network.packets.swg.zone.CmdSceneReady; import network.packets.swg.zone.GalaxyLoopTimesRequest; import network.packets.swg.zone.GalaxyLoopTimesResponse; import network.packets.swg.zone.HeartBeatMessage; +import network.packets.swg.zone.SetWaypointColor; import resources.Galaxy; import resources.Location; import resources.Race; @@ -41,6 +42,8 @@ import resources.control.Service; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; +import resources.objects.waypoint.WaypointObject; +import resources.objects.waypoint.WaypointObject.WaypointColor; import resources.player.AccessLevel; import resources.player.Player; import resources.player.PlayerEvent; @@ -93,8 +96,31 @@ public class ZoneService extends Service { handleGalaxyLoopTimesRequest(player, (GalaxyLoopTimesRequest) p); if (p instanceof CmdSceneReady) handleCmdSceneReady(player, (CmdSceneReady) p); + if (p instanceof SetWaypointColor) + handleSetWaypointColor(player, (SetWaypointColor) p); } + private void handleSetWaypointColor(Player player, SetWaypointColor p) { + // TODO Should move this to a different service, maybe make a service for other packets similar to this (ie misc.) + PlayerObject ghost = (PlayerObject) player.getPlayerObject(); + + WaypointObject waypoint = ghost.getWaypoint(p.getObjId()); + if (waypoint == null) + return; + + switch(p.getColor()) { + case "blue": waypoint.setColor(WaypointColor.BLUE); break; + case "green": waypoint.setColor(WaypointColor.GREEN); break; + case "orange": waypoint.setColor(WaypointColor.ORANGE); break; + case "yellow": waypoint.setColor(WaypointColor.YELLOW); break; + case "purple": waypoint.setColor(WaypointColor.PURPLE); break; + case "white": waypoint.setColor(WaypointColor.WHITE); break; + default: System.err.println("Don't know color " + p.getColor()); + } + + ghost.updateWaypoint(waypoint); + } + private void sendServerInfo(Galaxy galaxy, long networkId) { Config c = getConfig(ConfigFile.PRIMARY); String name = c.getString("ZONE-SERVER-NAME", galaxy.getName());