From f7bac13377eac7d9f95f62be051719ce36e0ffb4 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Thu, 10 Apr 2014 18:13:45 -0400 Subject: [PATCH] Added chat channels for all planets (system and planetary chat) --- src/protocol/swg/chat/ChatRoomList.java | 59 ++++++++++++------ src/protocol/swg/chat/ChatServerStatus.java | 2 + src/protocol/swg/chat/VoiceChatStatus.java | 47 +++++++++++++++ src/services/TerrainService.java | 5 ++ src/services/chat/ChatRoom.java | 1 - src/services/chat/ChatService.java | 66 ++++++++++++++++----- src/services/object/ObjectService.java | 24 ++++---- 7 files changed, 159 insertions(+), 45 deletions(-) create mode 100644 src/protocol/swg/chat/VoiceChatStatus.java diff --git a/src/protocol/swg/chat/ChatRoomList.java b/src/protocol/swg/chat/ChatRoomList.java index b183b140..3021f72f 100644 --- a/src/protocol/swg/chat/ChatRoomList.java +++ b/src/protocol/swg/chat/ChatRoomList.java @@ -34,11 +34,16 @@ import services.chat.ChatRoom; public class ChatRoomList extends SWGMessage { private ConcurrentHashMap chatRooms; + private ChatRoom room; public ChatRoomList(ConcurrentHashMap chatRooms) { this.chatRooms = chatRooms; } + public ChatRoomList(ChatRoom room) { + this.room = room; + } + @Override public void deserialize(IoBuffer data) { @@ -53,24 +58,42 @@ public class ChatRoomList extends SWGMessage { buffer.putShort((short) 2); buffer.putInt(0x70DEB197); - buffer.putInt(chatRooms.size()); - chatRooms.forEach((key, value) -> { - if (value.isVisible()) { - buffer.putInt(value.getRoomId()); - buffer.putInt((int) ((value.isPrivateRoom() ? 1 : 0))); - buffer.put((byte) ((value.isModeratorsOnly() ? 1 : 0))); - buffer.put(getAsciiString(value.getRoomAddress())); - buffer.put(getAsciiString("SWG")); - buffer.put(getAsciiString(server)); - buffer.put(getAsciiString(value.getOwner())); - buffer.put(getAsciiString("SWG")); - buffer.put(getAsciiString(server)); - buffer.put(getAsciiString(value.getCreator())); - buffer.put(getUnicodeString(value.getDescription())); - buffer.putInt(0); // moderator list (not used by client) - buffer.putInt(0); // user list (not used by client) - } - }); + if (room != null) { + buffer.putInt(1); + + buffer.putInt(room.getRoomId()); + buffer.putInt((int) ((room.isPrivateRoom() ? 1 : 0))); + buffer.put((byte) ((room.isModeratorsOnly() ? 1 : 0))); + buffer.put(getAsciiString(room.getRoomAddress())); + buffer.put(getAsciiString("SWG")); + buffer.put(getAsciiString(server)); + buffer.put(getAsciiString(room.getOwner())); + buffer.put(getAsciiString("SWG")); + buffer.put(getAsciiString(server)); + buffer.put(getAsciiString(room.getCreator())); + buffer.put(getUnicodeString(room.getDescription())); + buffer.putInt(0); // moderator list (not used by client) + buffer.putInt(0); // user list (not used by client) + } else { + buffer.putInt(chatRooms.size()); + chatRooms.forEach((key, value) -> { + if (value.isVisible()) { + buffer.putInt(value.getRoomId()); + buffer.putInt((int) ((value.isPrivateRoom() ? 1 : 0))); + buffer.put((byte) ((value.isModeratorsOnly() ? 1 : 0))); + buffer.put(getAsciiString(value.getRoomAddress())); + buffer.put(getAsciiString("SWG")); + buffer.put(getAsciiString(server)); + buffer.put(getAsciiString(value.getOwner())); + buffer.put(getAsciiString("SWG")); + buffer.put(getAsciiString(server)); + buffer.put(getAsciiString(value.getCreator())); + buffer.put(getUnicodeString(value.getDescription())); + buffer.putInt(0); // moderator list (not used by client) + buffer.putInt(0); // user list (not used by client) + } + }); + } buffer.flip(); //StringUtilities.printBytes(buffer.array()); return buffer; diff --git a/src/protocol/swg/chat/ChatServerStatus.java b/src/protocol/swg/chat/ChatServerStatus.java index a867a244..2de0db65 100644 --- a/src/protocol/swg/chat/ChatServerStatus.java +++ b/src/protocol/swg/chat/ChatServerStatus.java @@ -29,6 +29,8 @@ import protocol.swg.SWGMessage; public class ChatServerStatus extends SWGMessage { + public ChatServerStatus() { } + @Override public void deserialize(IoBuffer data) { } diff --git a/src/protocol/swg/chat/VoiceChatStatus.java b/src/protocol/swg/chat/VoiceChatStatus.java new file mode 100644 index 00000000..97936a19 --- /dev/null +++ b/src/protocol/swg/chat/VoiceChatStatus.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package protocol.swg.chat; + +import java.nio.ByteOrder; + +import org.apache.mina.core.buffer.IoBuffer; + +import protocol.swg.SWGMessage; + +public class VoiceChatStatus extends SWGMessage { + + public VoiceChatStatus() { } + + @Override + public void deserialize(IoBuffer data) { + } + + @Override + public IoBuffer serialize() { + IoBuffer buffer = IoBuffer.allocate(10).order(ByteOrder.LITTLE_ENDIAN); + buffer.putShort((short) 2); + buffer.putInt(0x9E601905); + buffer.putInt(1); + return buffer.flip(); + } + +} diff --git a/src/services/TerrainService.java b/src/services/TerrainService.java index c8b3aaf5..497477db 100644 --- a/src/services/TerrainService.java +++ b/src/services/TerrainService.java @@ -175,6 +175,11 @@ public class TerrainService { core.mapService.addPlanet(planet); noBuildAreas.put(planet, new ArrayList()); loadClientRegions(planet); + + core.chatService.createChatRoom("public chat for this planet, cannot create rooms here", name + ".Planet", "SYSTEM", true); + core.chatService.createChatRoom("system messages for this planet, cannot create rooms here", name + ".system", "SYSTEM", true); + + System.out.println("Created chat rooms for " + name); } diff --git a/src/services/chat/ChatRoom.java b/src/services/chat/ChatRoom.java index d489e3e1..1cc7f2a2 100644 --- a/src/services/chat/ChatRoom.java +++ b/src/services/chat/ChatRoom.java @@ -23,7 +23,6 @@ package services.chat; import java.util.Vector; -import resources.objects.creature.CreatureObject; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 06844115..4175d886 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -24,6 +24,7 @@ package services.chat; import java.nio.ByteOrder; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.Vector; @@ -40,6 +41,7 @@ import engine.resources.config.Config; import engine.resources.config.DefaultConfig; import engine.resources.database.ObjectDatabase; import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -48,6 +50,7 @@ import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import protocol.swg.AddIgnoreMessage; import protocol.swg.ObjControllerMessage; +import protocol.swg.chat.ChatCreateRoom; import protocol.swg.chat.ChatDeletePersistentMessage; import protocol.swg.chat.ChatEnterRoomById; import protocol.swg.chat.ChatFriendsListUpdate; @@ -55,6 +58,7 @@ import protocol.swg.chat.ChatInstantMessageToCharacter; import protocol.swg.chat.ChatInstantMessagetoClient; import protocol.swg.chat.ChatOnAddFriend; import protocol.swg.chat.ChatOnChangeFriendStatus; +import protocol.swg.chat.ChatOnCreateRoom; import protocol.swg.chat.ChatOnEnteredRoom; import protocol.swg.chat.ChatOnSendInstantMessage; import protocol.swg.chat.ChatOnSendPersistentMessage; @@ -65,6 +69,7 @@ import protocol.swg.chat.ChatRequestPersistentMessage; import protocol.swg.chat.ChatRoomList; import protocol.swg.chat.ChatRoomMessage; import protocol.swg.chat.ChatSendToRoom; +import protocol.swg.chat.ChatServerStatus; import protocol.swg.chat.ChatSystemMessage; import protocol.swg.objectControllerObjects.PlayerEmote; import protocol.swg.objectControllerObjects.SpatialChat; @@ -359,11 +364,10 @@ public class ChatService implements INetworkDispatch { if (obj == null) return; - //ChatServerStatus chatServerStatus = new ChatServerStatus(); - //client.getSession().write(chatServerStatus.serialize()); - ChatRoomList listMessage = new ChatRoomList(chatRooms); client.getSession().write(listMessage.serialize()); + + //System.out.println("Sent the room request responses."); } }); @@ -391,11 +395,13 @@ public class ChatService implements INetworkDispatch { if (room != null) { room.setPrivateRoom(sentPacket.isPrivacy()); room.setModeratorsOnly(sentPacket.isModeratorOnly()); - room.getUserList().add(creo); - room.getModeratorList().add(creo); + room.addUser(creo.getCustomName()); + room.addModerator(creo.getCustomName()); ChatOnCreateRoom response = new ChatOnCreateRoom(room, 0, sentPacket.getRequest()); session.write(response.serialize()); - }*/ + } + + System.out.println("Created room.");*/ }); @@ -417,6 +423,7 @@ public class ChatService implements INetworkDispatch { }); swgOpcodes.put(Opcodes.ChatSendToRoom, (session, data) -> { + //System.out.println("send to room!"); Client client = core.getClient(session); if(client == null) @@ -723,8 +730,19 @@ public class ChatService implements INetworkDispatch { } private void loadChatRooms() { - ChatRoom system = createChatRoom("", "Chat", "system", true); - chatRooms.put(system.getRoomId(), system); + + /* + * Battlefields channel format: + * SWG.serverName.battlefield.bfMapName + * + * TODO: Research other channel address formats + */ + + ChatRoom system = createChatRoom("", "system", "system", true); + System.out.println("Created chat room " + system.getRoomAddress()); + + //createChatRoom("Bounty Hunter chat for this galaxy", "BountyHunter", "SYSTEM", true); + //createChatRoom("Commando chat for this galaxy", "Commando", "SYSTEM", true); EntityCursor cursor = chatRoomsODB.getCursor(Integer.class, ChatRoom.class); cursor.forEach(room -> { @@ -763,25 +781,43 @@ public class ChatService implements INetworkDispatch { return room; } - public void joinChatRoom(String user, int roomId) { + public boolean joinChatRoom(String user, String roomAddress) { + chatRooms.forEach((k, v) -> { + if (v.getRoomAddress().equals(roomAddress)) { + joinChatRoom(user, k); + return; + } + }); + return false; + } + public boolean joinChatRoom(String user, int roomId) { if (user.contains(" ")) user = user.split(" ")[0]; ChatRoom room = getChatRoom(roomId); if (room == null) - return; - - if (!room.hasUser(user)) { + return false; + if (!room.hasUser(user.toLowerCase())) { + room.addUser(user.toLowerCase()); + + if (!room.isVisible()) { + CreatureObject creo = (CreatureObject) getObjectByFirstName(user); + if (creo != null) { + ChatRoomList listMessage = new ChatRoomList(room); + creo.getClient().getSession().write(listMessage.serialize()); + } + } ChatOnEnteredRoom enterRoom = new ChatOnEnteredRoom(user, 0, roomId, true); - room.addUser(user); - + room.getUserList().stream().forEach(str -> { SWGObject userObj = getObjectByFirstName(str); - if (userObj != null) { userObj.getClient().getSession().write(enterRoom.serialize()); } + userObj.getClient().getSession().write(enterRoom.serialize()); }); + return true; } + return false; } public void leaveChatRoom(CreatureObject player, int roomId) { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 816d910b..61aba9b9 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -72,6 +72,7 @@ import protocol.swg.chat.ChatOnConnectAvatar; import protocol.swg.chat.ChatOnGetFriendsList; import protocol.swg.chat.ChatRoomList; import protocol.swg.chat.ChatServerStatus; +import protocol.swg.chat.VoiceChatStatus; import protocol.swg.objectControllerObjects.UiPlayEffect; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.CrcStringTableVisitor; @@ -752,7 +753,7 @@ public class ObjectService implements INetworkDispatch { objectList.put(object.getObjectID(), object); } - }); + }); if(creature.getParentId() != 0) { SWGObject parent = getObject(creature.getParentId()); @@ -778,25 +779,25 @@ public class ObjectService implements INetworkDispatch { CmdStartScene startScene = new CmdStartScene((byte) 0, objectId, creature.getPlanet().getPath(), creature.getTemplate(), position.x, position.y, position.z, core.getGalacticTime(), 0); session.write(startScene.serialize()); + ChatServerStatus chatServerStatus = new ChatServerStatus(); + client.getSession().write(chatServerStatus.serialize()); + + VoiceChatStatus voiceStatus = new VoiceChatStatus(); + client.getSession().write(voiceStatus.serialize()); + ParametersMessage parameters = new ParametersMessage(); session.write(parameters.serialize()); - creature.makeAware(core.guildService.getGuildObject()); + ChatOnConnectAvatar chatConnect = new ChatOnConnectAvatar(); + creature.getClient().getSession().write(chatConnect.serialize()); + + creature.makeAware(core.guildService.getGuildObject()); core.chatService.loadMailHeaders(client); core.simulationService.handleZoneIn(client); creature.makeAware(creature); - ChatServerStatus chatStatus = new ChatServerStatus(); - creature.getClient().getSession().write(chatStatus.serialize()); - - ChatOnConnectAvatar chatConnect = new ChatOnConnectAvatar(); - creature.getClient().getSession().write(chatConnect.serialize()); - - ChatRoomList chatRooms = new ChatRoomList(core.chatService.getChatRooms()); - creature.getClient().getSession().write(chatRooms.serialize()); - //ChatOnGetFriendsList friendsListMessage = new ChatOnGetFriendsList(ghost); //client.getSession().write(friendsListMessage.serialize()); @@ -832,6 +833,7 @@ public class ObjectService implements INetworkDispatch { if(!core.getConfig().getString("MOTD").equals("")) creature.sendSystemMessage(core.getConfig().getString("MOTD"), (byte) 2); + core.chatService.joinChatRoom(creature.getCustomName().toLowerCase(), "SWG." + core.getGalaxyName() + "." + creature.getPlanet().getName() + ".Planet"); core.playerService.postZoneIn(creature); }