diff --git a/src/intents/NotifyPlayersPacketIntent.java b/src/intents/NotifyPlayersPacketIntent.java new file mode 100644 index 000000000..ddf890375 --- /dev/null +++ b/src/intents/NotifyPlayersPacketIntent.java @@ -0,0 +1,25 @@ +package intents; + +import network.packets.Packet; +import resources.Terrain; +import resources.control.Intent; + +public class NotifyPlayersPacketIntent extends Intent { + + public static final String TYPE = "GalaxyWidePacketIntent"; + + private Packet packet; + private Terrain terrain; + + public NotifyPlayersPacketIntent(Packet packet, Terrain terrain) { + super(TYPE); + this.packet = packet; + this.terrain = terrain; + } + public NotifyPlayersPacketIntent(Packet p) { + this(p, null); + } + + public Packet getPacket() { return packet; } + public Terrain getTerrain() { return terrain; } +} diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 7dfb7d060..00460f143 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -11,8 +11,10 @@ import network.packets.swg.login.ClientIdMsg; import network.packets.swg.zone.insertion.SelectCharacter; import intents.CloseConnectionIntent; import intents.GalacticPacketIntent; +import intents.NotifyPlayersPacketIntent; import intents.InboundPacketIntent; import intents.PlayerEventIntent; +import resources.Terrain; import resources.control.Intent; import resources.control.Manager; import resources.network.ServerType; @@ -41,6 +43,7 @@ public class PlayerManager extends Manager { registerForIntent(InboundPacketIntent.TYPE); registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(PlayerEventIntent.TYPE); + registerForIntent(NotifyPlayersPacketIntent.TYPE); return super.initialize(); } @@ -87,6 +90,12 @@ public class PlayerManager extends Manager { new CloseConnectionIntent(p.getNetworkId()).broadcast(); } } + } else if (i instanceof NotifyPlayersPacketIntent) { + NotifyPlayersPacketIntent intent = (NotifyPlayersPacketIntent) i; + if (intent.getTerrain() != null) + notifyPlayersAtPlanet(intent.getTerrain(), intent.getPacket()); + else + notifyPlayers(intent.getPacket()); } } @@ -162,6 +171,24 @@ public class PlayerManager extends Manager { return null; } + public void notifyPlayers(Packet... packets) { + synchronized(players) { + for (Player p : players.values()) { + if (p != null && p.getCreatureObject() != null) + p.sendPacket(packets); + } + } + } + + public void notifyPlayersAtPlanet(Terrain terrain, Packet... packets) { + synchronized(players) { + for (Player p : players.values()) { + if (p != null && p.getCreatureObject() != null && p.getCreatureObject().getLocation().getTerrain() == terrain) + p.sendPacket(packets); + } + } + } + public Player getPlayerFromNetworkId(long networkId) { return players.get(networkId); }