diff --git a/scripts/commands/generic/cmdBroadcast.py b/scripts/commands/generic/cmdBroadcast.py new file mode 100644 index 000000000..3b5f33ef1 --- /dev/null +++ b/scripts/commands/generic/cmdBroadcast.py @@ -0,0 +1,7 @@ +from intents.chat import ChatBroadcastIntent +from intents.chat.ChatBroadcastIntent import BroadcastType +import sys + +def execute(objManager, player, target, args): + ChatBroadcastIntent(args, player.getCreatureObject(), None, BroadcastType.AREA).broadcast() + return \ No newline at end of file diff --git a/scripts/commands/generic/cmdBroadcastArea.py b/scripts/commands/generic/cmdBroadcastArea.py new file mode 100644 index 000000000..3b5f33ef1 --- /dev/null +++ b/scripts/commands/generic/cmdBroadcastArea.py @@ -0,0 +1,7 @@ +from intents.chat import ChatBroadcastIntent +from intents.chat.ChatBroadcastIntent import BroadcastType +import sys + +def execute(objManager, player, target, args): + ChatBroadcastIntent(args, player.getCreatureObject(), None, BroadcastType.AREA).broadcast() + return \ No newline at end of file diff --git a/src/intents/chat/ChatBroadcastIntent.java b/src/intents/chat/ChatBroadcastIntent.java new file mode 100644 index 000000000..eb499c841 --- /dev/null +++ b/src/intents/chat/ChatBroadcastIntent.java @@ -0,0 +1,41 @@ +package intents.chat; + +import resources.Terrain; +import resources.control.Intent; +import resources.objects.SWGObject; + +public class ChatBroadcastIntent extends Intent { + public static final String TYPE = "ChatBroadcastIntent"; + + private BroadcastType broadcastType; + private SWGObject broadcaster; + private Terrain terrain; + private String message; + + public ChatBroadcastIntent(String message, SWGObject broadcaster, Terrain terrain, BroadcastType type) { + super(TYPE); + this.message = message; + this.broadcastType = type; + this.broadcaster = broadcaster; + this.terrain = terrain; + } + + public ChatBroadcastIntent(String message, BroadcastType type) { + this(message, null, null, type); + } + + public ChatBroadcastIntent(String message) { + this(message, null, null, BroadcastType.GALAXY); + } + + public BroadcastType getBroadcastType() { return broadcastType; } + public SWGObject getBroadcaster() { return broadcaster; } + public Terrain getTerrain() { return terrain; } + public String getMessage() { return message; } + + public enum BroadcastType { + AREA, + PLANET, + GALAXY + } +} diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index db6a2d50e..8ba519443 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -6,6 +6,7 @@ import java.util.List; import intents.GalacticPacketIntent; import intents.PlayerEventIntent; +import intents.chat.ChatBroadcastIntent; import intents.chat.PersistentMessageIntent; import intents.chat.SpatialChatIntent; import network.packets.Packet; @@ -18,6 +19,8 @@ import network.packets.swg.zone.chat.ChatOnSendPersistentMessage; import network.packets.swg.zone.chat.ChatPersistentMessageToClient; import network.packets.swg.zone.chat.ChatPersistentMessageToServer; import network.packets.swg.zone.chat.ChatRequestPersistentMessage; +import network.packets.swg.zone.chat.ChatSystemMessage; +import network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType; import network.packets.swg.zone.object_controller.ObjectController; import network.packets.swg.zone.object_controller.SpatialChat; import resources.control.Intent; @@ -46,6 +49,8 @@ public class ChatService extends Service { registerForIntent(SpatialChatIntent.TYPE); registerForIntent(PersistentMessageIntent.TYPE); registerForIntent(PlayerEventIntent.TYPE); + registerForIntent(ChatBroadcastIntent.TYPE); + mails.load(); mails.traverse(new Traverser() { @Override @@ -82,6 +87,8 @@ public class ChatService extends Service { handlePersistentMessageIntent((PersistentMessageIntent) i); else if (i instanceof PlayerEventIntent) handlePlayerEventIntent((PlayerEventIntent) i); + else if (i instanceof ChatBroadcastIntent) + handleChatBroadcast((ChatBroadcastIntent) i); } private void handlePlayerEventIntent(PlayerEventIntent intent) { @@ -93,6 +100,15 @@ public class ChatService extends Service { } } + private void handleChatBroadcast(ChatBroadcastIntent i) { + switch(i.getBroadcastType()) { + case AREA: broadcastAreaMessage(i.getMessage(), i.getBroadcaster()); break; + default: break; + //case PLANET: broadcastPlanetMessage(i.getMessage(), i.getTerrain()); break; + //case GALAXY: broadcastGalaxyMessage(i.getMessage()); break; + } + } + private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) { // ChatRoomList list = new ChatRoomList(); // list.addChatRoom(new ChatRoom(1, 0, 0, "SWG.Josh Wifi.Chat.tcpa", "SWG", "Josh Wifi", player.getCreatureObject().getName(), player.getCreatureObject().getName(), "Chat")); @@ -100,7 +116,7 @@ public class ChatService extends Service { } private void handleSpatialChat(SpatialChatIntent i) { - // TODO: Moods and emotes, also figure out one of the unknown ints. Might be that "Player A says to Player B" is one of the unknowns. (targetId in SpatialChat packet) + // TODO: Emotes, also figure out one of the unknown ints. Might be that "Player A says to Player B" is one of the unknowns. (targetId in SpatialChat packet) Player sender = i.getPlayer(); SWGObject actor = sender.getCreatureObject(); @@ -203,6 +219,16 @@ public class ChatService extends Service { sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy); } + private void broadcastAreaMessage(String message, SWGObject broadcaster) { + ChatSystemMessage packet = new ChatSystemMessage(SystemChatType.SCREEN_AND_CHAT.ordinal(), message); + broadcaster.getOwner().sendPacket(packet); + + List observers = broadcaster.getObservers(); + for (Player player : observers) { + player.sendPacket(packet); + } + } + private void sendPersistentMessageHeaders(Player player, String galaxy) { if (player == null || player.getCreatureObject() == null)