diff --git a/src/network/packets/swg/zone/insertion/ChatRoomList.java b/src/network/packets/swg/zone/insertion/ChatRoomList.java index 0a23aebca..d092f1a76 100644 --- a/src/network/packets/swg/zone/insertion/ChatRoomList.java +++ b/src/network/packets/swg/zone/insertion/ChatRoomList.java @@ -39,6 +39,8 @@ public class ChatRoomList extends SWGPacket { private Collection rooms; + public ChatRoomList() {} + public ChatRoomList(ChatRoom ... rooms) { this.rooms = Arrays.asList(rooms); } @@ -64,4 +66,13 @@ public class ChatRoomList extends SWGPacket { addList(data, rooms); return data; } + + public Collection getRooms() { + return rooms; + } + + @Override + public String toString() { + return "ChatRoomList[roomSize=" + rooms.size() + "]"; + } } diff --git a/src/resources/chat/ChatRoom.java b/src/resources/chat/ChatRoom.java index 33d94bcb8..897ec6961 100644 --- a/src/resources/chat/ChatRoom.java +++ b/src/resources/chat/ChatRoom.java @@ -55,7 +55,6 @@ public class ChatRoom implements Encodable, Serializable { private List moderators; private List invited; private boolean muted; // No one but moderators can talk - private boolean isPublic; private List banned; // Members are only actually apart of a room when they're "in the room", so we don't need to save this info // as each player will automatically re-join the room based on their joined channels list @@ -143,11 +142,11 @@ public class ChatRoom implements Encodable, Serializable { } public boolean isPublic() { - return isPublic; + return type == 0; } public void setIsPublic(boolean isPublic) { - this.isPublic = isPublic; + this.type = (isPublic ? 0 : 1); } public List getBanned() { @@ -161,7 +160,7 @@ public class ChatRoom implements Encodable, Serializable { if (members.contains(avatar)) return ChatResult.ROOM_ALREADY_JOINED; - if (isPublic || invited.contains(avatar)) + if (isPublic() || invited.contains(avatar)) return ChatResult.SUCCESS; return ChatResult.ROOM_AVATAR_NOT_INVITED; @@ -240,6 +239,6 @@ public class ChatRoom implements Encodable, Serializable { @Override public String toString() { return "ChatRoom[id=" + id + ", type=" + type + ", path='" + path + "', title='" + title + '\'' + - ", owner=" + owner + ", isPublic=" + isPublic + "]"; + ", creator=" + creator + ", muted=" + muted + ", isPublic=" + isPublic() + "]"; } } diff --git a/src/services/chat/ChatManager.java b/src/services/chat/ChatManager.java index 7b48a8306..f180c6435 100644 --- a/src/services/chat/ChatManager.java +++ b/src/services/chat/ChatManager.java @@ -173,8 +173,7 @@ public class ChatManager extends Manager { if (p instanceof ChatInstantMessageToCharacter) handleInstantMessage(pm, player, (ChatInstantMessageToCharacter) p); break; - default: - break; + default: break; } } @@ -195,7 +194,7 @@ public class ChatManager extends Manager { break; case PE_LOGGED_OUT: if (player.getCreatureObject() == null) - return; + break; updateChatAvatarStatus(player, intent.getGalaxy(), false); break; default: break; @@ -402,6 +401,8 @@ public class ChatManager extends Manager { sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy); } + /* Friends */ + private void updateChatAvatarStatus(Player player, String galaxy, boolean online) { PlayerManager playerManager = player.getPlayerManager(); String firstName = player.getCharacterName().toLowerCase(); @@ -477,12 +478,9 @@ public class ChatManager extends Manager { final List playersMail = new LinkedList<>(); final long receiverId = player.getCreatureObject().getObjectId(); - mails.traverse(new Traverser() { - @Override - public void process(Mail element) { - if (element.getReceiverId() == receiverId) - playersMail.add(element); - } + mails.traverse(element -> { + if (element.getReceiverId() == receiverId) + playersMail.add(element); }); for (Mail mail : playersMail) diff --git a/src/services/chat/ChatRoomService.java b/src/services/chat/ChatRoomService.java index 16a97b2c2..bb4332127 100644 --- a/src/services/chat/ChatRoomService.java +++ b/src/services/chat/ChatRoomService.java @@ -34,6 +34,7 @@ import network.packets.swg.SWGPacket; import network.packets.swg.zone.chat.ChatCreateRoom; import network.packets.swg.zone.chat.ChatEnterRoomById; import network.packets.swg.zone.chat.ChatOnCreateRoom; +import network.packets.swg.zone.chat.ChatOnDestroyRoom; import network.packets.swg.zone.chat.ChatOnEnteredRoom; import network.packets.swg.zone.chat.ChatOnLeaveRoom; import network.packets.swg.zone.chat.ChatOnSendRoomMessage; @@ -130,12 +131,12 @@ public class ChatRoomService extends Service { if (p instanceof ChatSendToRoom) handleChatSendToRoom(player, (ChatSendToRoom) p); break; case CHAT_REQUEST_ROOM_LIST: - if (p instanceof ChatRequestRoomList) - handleChatRoomListRequest(player); + if (p instanceof ChatRequestRoomList) handleChatRoomListRequest(player); break; case CHAT_CREATE_ROOM: if (p instanceof ChatCreateRoom) handleChatCreateRoom(player, (ChatCreateRoom) p); break; + default: break; } } @@ -310,7 +311,14 @@ public class ChatRoomService extends Service { return; } } - System.err.println("Tried to join a room with a path that does not exist: " + path); + // Channel was not found, attempt to remove it from this players list of channels if it exists. + // This can happen if a channel was deleted while the player was offline + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) { + System.err.println("Tried to join a room with a path that does not exist: " + path); + return; + } + ghost.removeJoinedChannel(path); } public void leaveChatChannel(Player player, ChatRoom room, int sequence) { @@ -375,10 +383,7 @@ public class ChatRoomService extends Service { } public boolean destroyRoom(ChatRoom room) { - // Remove existing, online, members from the room - // Remove room from map and database - // Remove roompath from joinedChannels list if player tried to join an invalid room - return false; + return room != null && roomMap.remove(room.getId()) != null; } public void createSystemChannels(String galaxy) { @@ -392,7 +397,7 @@ public class ChatRoomService extends Service { */ ChatAvatar systemAvatar = ChatAvatar.getSystemAvatar(galaxy); - // TODO: Move to server datatable file (SDF): Room (s) | Title (s) | Private (b) + // TODO: Move to server datatable file (SDF): Room (s) | Title (s) String basePath = "SWG." + galaxy + "."; createRoom(systemAvatar, true, basePath + "Galaxy", "public chat for the whole galaxy, cannot create rooms here"); createRoom(systemAvatar, true, basePath + "system", "system messages for this galaxy"); @@ -414,7 +419,18 @@ public class ChatRoomService extends Service { createRoom(systemAvatar, true, basePath + "Trader", "Trader chat for this galaxy"); createRoom(systemAvatar, true, basePath + "BeastMastery", "Beast Mastery chat for this galaxy"); createRoom(systemAvatar, true, basePath + "Auction", "Auction chat for this galaxy"); + createRoom(systemAvatar, true, basePath + "GuildLeader", "Guild leader chat for this galaxy"); + createRoom(systemAvatar, true, basePath + "Mayor", "Mayor chat for this galaxy"); + createRoom(systemAvatar, true, basePath + "Trader", "Trader chat for this galaxy"); createPlanetChannels(systemAvatar, basePath); + + /* + Battlefield Room path examples: + SWG.Bria.corellia.battlefield + SWG.Bria.corellia.battlefield.corellia_mountain_fortress.allFactions + SWG.Bria.corellia.battlefield.corellia_pvp.allFactions / Imperial / Rebel + SWG.Bria.corellia.battlefield.corellia_rebel_riverside_fort.allFactions + */ } private void createPlanetChannels(ChatAvatar systemAvatar, String basePath) { diff --git a/src/services/commands/CommandService.java b/src/services/commands/CommandService.java index de225a83b..c585ceb92 100644 --- a/src/services/commands/CommandService.java +++ b/src/services/commands/CommandService.java @@ -53,12 +53,12 @@ import services.galaxy.GalacticManager; public class CommandService extends Service { - private Map commands; // NOTE: CRC's are all lowercased for commands! - private Map commandCrcLookup; + private final Map commands; // NOTE: CRC's are all lowercased for commands! + private final Map commandCrcLookup; public CommandService() { - commands = new HashMap(); - commandCrcLookup = new HashMap(); + commands = new HashMap<>(); + commandCrcLookup = new HashMap<>(); } @Override diff --git a/src/utilities/ByteUtilities.java b/src/utilities/ByteUtilities.java index 051222e86..8410844b3 100644 --- a/src/utilities/ByteUtilities.java +++ b/src/utilities/ByteUtilities.java @@ -35,27 +35,27 @@ public class ByteUtilities { private static final ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE); private static final char [] HEX = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; - public static final String getHexString(byte [] bytes) { + public static String getHexString(byte [] bytes) { StringBuffer ret = new StringBuffer(bytes.length*2+(bytes.length>0?bytes.length-1:0)); for (byte b : bytes) { - ret.append(getHexString(b) + ' '); + ret.append(getHexString(b)).append(' '); } return new String(ret); } - public static final String getHexString(Byte [] bytes) { + public static String getHexString(Byte [] bytes) { StringBuffer ret = new StringBuffer(bytes.length*2+(bytes.length>0?bytes.length-1:0)); for (byte b : bytes) { - ret.append(getHexString(b) + ' '); + ret.append(getHexString(b)).append(' '); } return new String(ret); } - public static final String getHexString(byte b) { + public static String getHexString(byte b) { return String.valueOf(HEX[(b&0xFF) >>> 4]) + HEX[b & 0x0F]; } - public static final byte [] longToBytes(long l) { + public static byte [] longToBytes(long l) { byte [] b = new byte[Long.SIZE]; synchronized (buffer) { buffer.putLong(0, l); @@ -64,11 +64,11 @@ public class ByteUtilities { return b; } - public static final long bytesToLong(byte [] a) { + public static long bytesToLong(byte [] a) { return bytesToLong(a, 0); } - public static final long bytesToLong(byte [] a, int offset) { + public static long bytesToLong(byte [] a, int offset) { long l = 0; synchronized (buffer) { for (int i = 0; i < Long.SIZE; i++) {