diff --git a/src/intents/chat/ChatBroadcastIntent.java b/src/intents/chat/ChatBroadcastIntent.java index eb499c841..2dd728644 100644 --- a/src/intents/chat/ChatBroadcastIntent.java +++ b/src/intents/chat/ChatBroadcastIntent.java @@ -2,17 +2,19 @@ package intents.chat; import resources.Terrain; import resources.control.Intent; -import resources.objects.SWGObject; +import resources.encodables.ProsePackage; +import resources.player.Player; public class ChatBroadcastIntent extends Intent { public static final String TYPE = "ChatBroadcastIntent"; private BroadcastType broadcastType; - private SWGObject broadcaster; + private Player broadcaster; private Terrain terrain; private String message; + private ProsePackage prose; - public ChatBroadcastIntent(String message, SWGObject broadcaster, Terrain terrain, BroadcastType type) { + public ChatBroadcastIntent(String message, Player broadcaster, Terrain terrain, BroadcastType type) { super(TYPE); this.message = message; this.broadcastType = type; @@ -20,6 +22,11 @@ public class ChatBroadcastIntent extends Intent { this.terrain = terrain; } + public ChatBroadcastIntent(Player receiver, ProsePackage prose) { + this(null, receiver, null, BroadcastType.PERSONAL); + this.prose = prose; + } + public ChatBroadcastIntent(String message, BroadcastType type) { this(message, null, null, type); } @@ -29,13 +36,15 @@ public class ChatBroadcastIntent extends Intent { } public BroadcastType getBroadcastType() { return broadcastType; } - public SWGObject getBroadcaster() { return broadcaster; } + public Player getBroadcaster() { return broadcaster; } public Terrain getTerrain() { return terrain; } public String getMessage() { return message; } + public ProsePackage getProse() { return prose; } public enum BroadcastType { AREA, PLANET, - GALAXY + GALAXY, + PERSONAL } } diff --git a/src/resources/commands/callbacks/RequestWaypointCmdCallback.java b/src/resources/commands/callbacks/RequestWaypointCmdCallback.java index d4e36fa21..9f066a324 100644 --- a/src/resources/commands/callbacks/RequestWaypointCmdCallback.java +++ b/src/resources/commands/callbacks/RequestWaypointCmdCallback.java @@ -11,12 +11,14 @@ public class RequestWaypointCmdCallback implements ICmdCallback { @Override public void execute(ObjectManager objManager, Player player, SWGObject target, String args) { + // Args: (^-,=+_)color_1(,+-=_^)=1 planet x 0.0 z PlayerObject ghost = (PlayerObject) player.getPlayerObject(); if (ghost == null) return; + String[] cmd = args.split(" ", 5); WaypointObject waypoint = (WaypointObject) objManager.createObject("object/waypoint/shared_waypoint.iff", player.getCreatureObject().getLocation()); + waypoint.setLocation(Double.valueOf(cmd[2]), 0, Double.valueOf(cmd[4])); ghost.addWaypoint(waypoint); } - } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index e099e71fd..f3317d2d4 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -63,15 +63,15 @@ public class CreatureObject extends TangibleObject { 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); + private SWGList hamEncumbList = new SWGList(BaselineType.CREO, 4, 2, true); private SWGList attributes = new SWGList(BaselineType.CREO, 6, 21, true); private SWGList maxAttributes = new SWGList(BaselineType.CREO, 6, 22, true); private SWGList equipmentList = new SWGList(BaselineType.CREO, 6, 23); private SWGList appearanceList = new SWGList(BaselineType.CREO, 6, 33); - private SWGMap skillMods = new SWGMap<>(BaselineType.CREO, 4, 11, StringType.ASCII); // TODO: SkillMod structure - private SWGMap missionCriticalObjs = new SWGMap<>(BaselineType.CREO, 4, 21); - private SWGMap abilities = new SWGMap<>(BaselineType.CREO, 4, 22, StringType.ASCII); + private SWGMap skillMods = new SWGMap<>(BaselineType.CREO, 4, 3, StringType.ASCII); // TODO: SkillMod structure + private SWGMap missionCriticalObjs = new SWGMap<>(BaselineType.CREO, 4, 13); + private SWGMap abilities = new SWGMap<>(BaselineType.CREO, 4, 14, StringType.ASCII); private SWGMap buffs = new SWGMap<>(BaselineType.CREO, 6, 26); // TODO: Buff structure @@ -88,12 +88,14 @@ public class CreatureObject extends TangibleObject { equipmentList.add(new Equipment((WeaponObject) obj)); else equipmentList.add(new Equipment(obj.getObjectId(), obj.getTemplate())); + equipmentList.sendDeltaMessage(this); } } public void addAppearanceItem(SWGObject obj) { synchronized(appearanceList) { appearanceList.add(new Equipment(obj.getObjectId(), obj.getTemplate())); + appearanceList.sendDeltaMessage(this); } } @@ -218,52 +220,52 @@ public class CreatureObject extends TangibleObject { public void setMovementScale(double movementScale) { this.movementScale = movementScale; - sendDelta(4, 12, movementScale); + sendDelta(4, 4, movementScale); } public void setMovementPercent(double movementPercent) { this.movementPercent = movementPercent; - sendDelta(4, 13, movementPercent); + sendDelta(4, 5, movementPercent); } public void setWalkSpeed(double walkSpeed) { this.walkSpeed = walkSpeed; - sendDelta(4, 19, walkSpeed); + sendDelta(4, 11, walkSpeed); } public void setRunSpeed(double runSpeed) { this.runSpeed = runSpeed; - sendDelta(4, 15, runSpeed); + sendDelta(4, 7, runSpeed); } public void setAccelScale(double accelScale) { this.accelScale = accelScale; - sendDelta(4, 8, accelScale); + sendDelta(4, 0, accelScale); } public void setAccelPercent(double accelPercent) { this.accelPercent = accelPercent; - sendDelta(4, 9, accelPercent); + sendDelta(4, 1, accelPercent); } public void setTurnScale(double turnScale) { this.turnScale = turnScale; - sendDelta(4, 18, turnScale); + sendDelta(4, 10, turnScale); } public void setSlopeModAngle(double slopeModAngle) { this.slopeModAngle = slopeModAngle; - sendDelta(4, 16, slopeModAngle); + sendDelta(4, 8, slopeModAngle); } public void setSlopeModPercent(double slopeModPercent) { this.slopeModPercent = slopeModPercent; - sendDelta(4, 17, slopeModPercent); + sendDelta(4, 9, slopeModPercent); } public void setWaterModPercent(double waterModPercent) { this.waterModPercent = waterModPercent; - sendDelta(4, 20, waterModPercent); + sendDelta(4, 12, waterModPercent); } public void setHeight(double height) { @@ -273,7 +275,7 @@ public class CreatureObject extends TangibleObject { public void setPerformanceListenTarget(long performanceListenTarget) { this.performanceListenTarget = performanceListenTarget; - sendDelta(4, 14, performanceListenTarget); + sendDelta(4, 6, performanceListenTarget); } public void setGuildId(int guildId) { @@ -293,7 +295,7 @@ public class CreatureObject extends TangibleObject { public void setTotalLevelXp(int totalLevelXp) { this.totalLevelXp = totalLevelXp; - sendDelta(4, 23, totalLevelXp); + sendDelta(4, 15, totalLevelXp); } public void setDifficulty(CreatureDifficulty difficulty) { @@ -616,22 +618,22 @@ public class CreatureObject extends TangibleObject { public void createBaseline4(Player target, BaselineBuilder bb) { super.createBaseline4(target, bb); // 0 variables - bb.addFloat((float) accelScale); // 8 - bb.addFloat((float) accelPercent); // 9 - bb.addObject(hamEncumbList); // 10 - bb.addObject(skillMods); // 11 - bb.addFloat((float) movementScale); // 12 - bb.addFloat((float) movementPercent); // 13 - bb.addLong(performanceListenTarget); // 14 - bb.addFloat((float) runSpeed); // 15 - bb.addFloat((float) slopeModAngle); // 16 - bb.addFloat((float) slopeModPercent); // 17 - bb.addFloat((float) turnScale); // 18 - bb.addFloat((float) walkSpeed); // 19 - bb.addFloat((float) waterModPercent); // 20 - bb.addObject(missionCriticalObjs); // 21 - bb.addObject(abilities); // 22 - bb.addInt(totalLevelXp); // 23 + bb.addFloat((float) accelScale); // 0 + bb.addFloat((float) accelPercent); // 1 + bb.addObject(hamEncumbList); // 2 + bb.addObject(skillMods); // 3 + bb.addFloat((float) movementScale); // 4 + bb.addFloat((float) movementPercent); // 5 + bb.addLong(performanceListenTarget); // 6 + bb.addFloat((float) runSpeed); // 7 + bb.addFloat((float) slopeModAngle); // 8 + bb.addFloat((float) slopeModPercent); // 9 + bb.addFloat((float) turnScale); // 10 + bb.addFloat((float) walkSpeed); // 11 + bb.addFloat((float) waterModPercent); // 12 + bb.addObject(missionCriticalObjs); // 13 + bb.addObject(abilities); // 14 + bb.addInt(totalLevelXp); // 15 bb.incremeantOperandCount(16); } diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index e021e1312..0ec06a7ba 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -14,7 +14,6 @@ import intents.PlayerEventIntent; import intents.ServerStatusIntent; import intents.ServerStatusIntent.ServerStatus; import intents.chat.ChatBroadcastIntent; -import intents.chat.ChatBroadcastIntent.BroadcastType; import intents.chat.PersistentMessageIntent; import intents.chat.SpatialChatIntent; import network.packets.Packet; @@ -35,6 +34,8 @@ import network.packets.swg.zone.object_controller.SpatialChat; import resources.Terrain; import resources.control.Intent; import resources.control.Service; +import resources.encodables.OutOfBand; +import resources.encodables.ProsePackage; import resources.encodables.player.Mail; import resources.objects.SWGObject; import resources.player.Player; @@ -148,10 +149,20 @@ public class ChatService extends Service { } private void handleChatBroadcast(ChatBroadcastIntent i) { - if (i.getBroadcastType() == BroadcastType.AREA) - broadcastAreaMessage(i.getMessage(), i.getBroadcaster()); - else - broadcastGalaxyMessage(i.getMessage(), i.getTerrain()); + switch(i.getBroadcastType()) { + case AREA: + broadcastAreaMessage(i.getMessage(), i.getBroadcaster()); + break; + case PLANET: + broadcastGalaxyMessage(i.getMessage(), i.getTerrain()); // TODO: Planet specific system messages + break; + case GALAXY: + broadcastGalaxyMessage(i.getMessage(), i.getTerrain()); + break; + case PERSONAL: + broadcastPersonalMessage(i.getProse(), i.getBroadcaster()); + break; + } } private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) { @@ -252,11 +263,11 @@ public class ChatService extends Service { sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy); } - private void broadcastAreaMessage(String message, SWGObject broadcaster) { + private void broadcastAreaMessage(String message, Player broadcaster) { ChatSystemMessage packet = new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT.ordinal(), message); - broadcaster.getOwner().sendPacket(packet); + broadcaster.sendPacket(packet); - List observers = broadcaster.getObservers(); + List observers = broadcaster.getCreatureObject().getObservers(); for (Player player : observers) { player.sendPacket(packet); } @@ -267,6 +278,11 @@ public class ChatService extends Service { new NotifyPlayersPacketIntent(packet, terrain).broadcast(); } + private void broadcastPersonalMessage(ProsePackage prose, Player player) { + OutOfBand pckg = new OutOfBand(prose); + player.sendPacket(new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT, pckg)); + } + private void sendShutdownBroadcasts(final long time) { final AtomicInteger runCount = new AtomicInteger(); final long interval = (int) (time / 3); diff --git a/src/services/player/ZoneService.java b/src/services/player/ZoneService.java index 43f491526..a006a4ff4 100644 --- a/src/services/player/ZoneService.java +++ b/src/services/player/ZoneService.java @@ -31,6 +31,8 @@ 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 network.packets.swg.zone.spatial.GetMapLocationsMessage; +import network.packets.swg.zone.spatial.GetMapLocationsResponseMessage; import resources.Galaxy; import resources.Location; import resources.Race; @@ -98,8 +100,15 @@ public class ZoneService extends Service { handleCmdSceneReady(player, (CmdSceneReady) p); if (p instanceof SetWaypointColor) handleSetWaypointColor(player, (SetWaypointColor) p); + if (p instanceof GetMapLocationsMessage) + handleMapLocationsResponse(player, (GetMapLocationsMessage) p); } + private void handleMapLocationsResponse(Player player, GetMapLocationsMessage p) { + // TODO Implement actual handling in GU2, this is to avoid constant map location requests from the client + player.sendPacket(new GetMapLocationsResponseMessage(p.getPlanet())); + } + 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();