diff --git a/src/intents/PlayerEventIntent.java b/src/intents/PlayerEventIntent.java index 47b5fd02..c854ee93 100644 --- a/src/intents/PlayerEventIntent.java +++ b/src/intents/PlayerEventIntent.java @@ -10,6 +10,7 @@ public class PlayerEventIntent extends Intent { private Player player; private PlayerEvent event; + private String galaxy; public PlayerEventIntent(Player p, PlayerEvent event) { super(TYPE); @@ -17,6 +18,11 @@ public class PlayerEventIntent extends Intent { setEvent(event); } + public PlayerEventIntent(Player p, String galaxy, PlayerEvent event) { + this(p, event); + this.galaxy = galaxy; + } + public void setPlayer(Player p) { this.player = p; } @@ -33,4 +39,7 @@ public class PlayerEventIntent extends Intent { return event; } + public String getGalaxy() { + return galaxy; + } } diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 67fc31eb..3dfd859d 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -1,12 +1,16 @@ package services.chat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import intents.GalacticPacketIntent; +import intents.PlayerEventIntent; import intents.chat.PersistentMessageIntent; import intents.chat.SpatialChatIntent; import network.packets.Packet; import network.packets.swg.zone.ChatRequestRoomList; +import network.packets.swg.zone.chat.ChatDeletePersistentMessage; import network.packets.swg.zone.chat.ChatInstantMessageToCharacter; import network.packets.swg.zone.chat.ChatInstantMessageToClient; import network.packets.swg.zone.chat.ChatOnSendInstantMessage; @@ -40,6 +44,7 @@ public class ChatService extends Service { registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(SpatialChatIntent.TYPE); registerForIntent(PersistentMessageIntent.TYPE); + registerForIntent(PlayerEventIntent.TYPE); mails.loadToCache(); mails.traverse(new Traverser() { @Override @@ -66,12 +71,25 @@ public class ChatService extends Service { ((GalacticPacketIntent) i).getGalaxy().getName(), (ChatPersistentMessageToServer) p); else if (p instanceof ChatRequestPersistentMessage) handlePersistentMessageRequest(player, ((GalacticPacketIntent) i).getGalaxy().getName(), (ChatRequestPersistentMessage) p); + else if (p instanceof ChatDeletePersistentMessage) + deletePersistentMessage(((ChatDeletePersistentMessage) p).getMailId()); } } else if (i instanceof SpatialChatIntent) handleSpatialChat((SpatialChatIntent) i); else if (i instanceof PersistentMessageIntent) handlePersistentMessageIntent((PersistentMessageIntent) i); + else if (i instanceof PlayerEventIntent) + handlePlayerEventIntent((PlayerEventIntent) i); + } + + private void handlePlayerEventIntent(PlayerEventIntent intent) { + switch(intent.getEvent()) { + case PE_ZONE_IN: + sendPersistentMessageHeaders(intent.getPlayer(), intent.getGalaxy()); + break; + default: break; + } } private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) { @@ -186,6 +204,29 @@ public class ChatService extends Service { sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy); } + private void sendPersistentMessageHeaders(Player player, String galaxy) { + + if (player == null || player.getCreatureObject() == null) + return; + + final long receiverId = player.getCreatureObject().getObjectId(); + + final List playersMail = new ArrayList(); + + mails.traverse(new Traverser() { + @Override + public void process(Mail element) { + if (element.getReceiverId() == receiverId) + playersMail.add(element); + } + }); + + if (playersMail.isEmpty()) + return; + + for (Mail mail : playersMail) { sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy); } + } + private void sendPersistentMessage(Player receiver, Mail mail, MailFlagType requestType, String galaxy) { if (receiver == null || receiver.getCreatureObject() == null) return; @@ -209,6 +250,10 @@ public class ChatService extends Service { receiver.sendPacket(packet); } + private void deletePersistentMessage(int mailId) { + mails.remove(mailId); + } + private enum MailFlagType { FULL_MESSAGE, HEADER_ONLY; diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 25df3cba..2c143dce 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -1,6 +1,7 @@ package services.objects; import intents.GalacticPacketIntent; +import intents.PlayerEventIntent; import intents.swgobject_events.SWGObjectEventIntent; import java.util.ArrayList; @@ -37,6 +38,7 @@ import resources.objects.tangible.TangibleObject; import resources.objects.waypoint.WaypointObject; import resources.objects.weapon.WeaponObject; import resources.player.Player; +import resources.player.PlayerEvent; import resources.server_info.ObjectDatabase; import resources.server_info.ObjectDatabase.Traverser; import services.player.PlayerManager; @@ -109,7 +111,7 @@ public class ObjectManager extends Manager { if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; if (gpi.getPacket() instanceof SelectCharacter) { - zoneInCharacter(gpi.getPlayerManager(), gpi.getNetworkId(), ((SelectCharacter)gpi.getPacket()).getCharacterId()); + zoneInCharacter(gpi.getPlayerManager(), gpi.getGalaxy().getName(), gpi.getNetworkId(), ((SelectCharacter)gpi.getPacket()).getCharacterId()); } else if (gpi.getPacket() instanceof ObjectController) { ObjectController controller = (ObjectController) gpi.getPacket(); if (controller.getControllerData() instanceof DataTransform) { @@ -210,7 +212,7 @@ public class ObjectManager extends Manager { } } - private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) { + private void zoneInCharacter(PlayerManager playerManager, String galaxy, long netId, long characterId) { Player player = playerManager.getPlayerFromNetworkId(netId); if (player != null) { verifyPlayerObjectsSet(player, characterId); @@ -231,6 +233,7 @@ public class ObjectManager extends Manager { creature.clearAware(); moveObject(null, creature, creature.getLocation(), creature.getLocation()); updateAwarenessForObject(creature); + new PlayerEventIntent(player, galaxy, PlayerEvent.PE_ZONE_IN).broadcast(); } } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 60bf0690..187ccb9d 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -111,6 +111,7 @@ public class LoginService extends Service { case "admin": player.setAccessLevel(AccessLevel.ADMIN); break; case "dev": player.setAccessLevel(AccessLevel.DEV); break; case "qa": player.setAccessLevel(AccessLevel.QA); break; + default: player.setAccessLevel(AccessLevel.PLAYER); break; } sendLoginSuccessPacket(player); System.out.println("LoginService: " + player.getUsername() + " has logged in.");