diff --git a/src/protocol/swg/ChatCreateRoom.java b/src/protocol/swg/ChatCreateRoom.java index 5f63614a..640cba0e 100644 --- a/src/protocol/swg/ChatCreateRoom.java +++ b/src/protocol/swg/ChatCreateRoom.java @@ -23,11 +23,23 @@ package protocol.swg; import org.apache.mina.core.buffer.IoBuffer; + public class ChatCreateRoom extends SWGMessage { + private String address, title; + private boolean privacy, moderatorOnly; + private int request; + + public ChatCreateRoom() { } @Override public void deserialize(IoBuffer data) { + this.privacy = (boolean) ((data.get() == 1) ? false : true); + this.moderatorOnly = (boolean) ((data.get() == 1) ? true : false); + data.getShort(); // unk + this.address = getAsciiString(data); + this.title = getAsciiString(data); + this.request = data.getInt(); } @Override @@ -35,4 +47,21 @@ public class ChatCreateRoom extends SWGMessage { return null; } + public String getAddress() { + return address; + } + public String getTitle() { + return title; + } + public boolean isPrivacy() { + return privacy; + } + public boolean isModeratorOnly() { + return moderatorOnly; + } + + public int getRequest() { + return request; + } + } diff --git a/src/protocol/swg/ChatEnterRoomById.java b/src/protocol/swg/ChatEnterRoomById.java index 29fd69cd..a5b2d4c3 100644 --- a/src/protocol/swg/ChatEnterRoomById.java +++ b/src/protocol/swg/ChatEnterRoomById.java @@ -23,15 +23,24 @@ package protocol.swg; import org.apache.mina.core.buffer.IoBuffer; +import resources.common.StringUtilities; + public class ChatEnterRoomById extends SWGMessage { private int roomId; + private int requestId; public ChatEnterRoomById() { } @Override public void deserialize(IoBuffer data) { - setRoomId(data.getInt()); + StringUtilities.printBytes(data.array()); + data.getShort(); + data.getInt(); + + this.requestId = data.getInt(); + this.roomId = data.getInt(); + // getAsciiString(data); // name of the room but don't need it since we have id. } @Override @@ -39,12 +48,12 @@ public class ChatEnterRoomById extends SWGMessage { return null; } + public int getRequestId() { + return requestId; + } + public int getRoomId() { return roomId; } - public void setRoomId(int roomId) { - this.roomId = roomId; - } - } diff --git a/src/protocol/swg/ChatOnCreateRoom.java b/src/protocol/swg/ChatOnCreateRoom.java index be54a71d..0492800c 100644 --- a/src/protocol/swg/ChatOnCreateRoom.java +++ b/src/protocol/swg/ChatOnCreateRoom.java @@ -21,6 +21,10 @@ ******************************************************************************/ package protocol.swg; +import java.nio.ByteOrder; + +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import services.chat.ChatRoom; @@ -28,9 +32,13 @@ import services.chat.ChatRoom; public class ChatOnCreateRoom extends SWGMessage { private ChatRoom room; + private int error; + private int requestId; - public ChatOnCreateRoom(ChatRoom room) { + public ChatOnCreateRoom(ChatRoom room, int error, int requestId) { this.room = room; + this.error = error; + this.requestId = requestId; } @Override @@ -40,8 +48,46 @@ public class ChatOnCreateRoom extends SWGMessage { @Override public IoBuffer serialize() { - // TODO Auto-generated method stub - return null; + String server = NGECore.getInstance().getGalaxyName(); + IoBuffer data = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN); + data.setAutoExpand(true); + + data.putShort((short) 4); + data.putInt(0x35D7CC9F); + + data.putInt(error); + data.putInt(room.getRoomId()); + data.putInt(room.isPrivateRoom() ? 0 : 1); + data.put((byte) (room.isModeratorsOnly() ? 1 : 0)); + data.put(getAsciiString(room.getRoomAddress())); + data.put(getAsciiString("SWG")); + data.put(getAsciiString(server)); + data.put(getAsciiString(room.getCreator())); + data.put(getAsciiString("SWG")); + data.put(getAsciiString(server)); + data.put(getAsciiString(room.getOwner())); + data.put(getUnicodeString(room.getDescription())); + + data.putInt(0); + /*if (room.getModeratorList().size() > 0) { + for (CreatureObject creo : room.getModeratorList()) { + data.put(getAsciiString("SWG")); + data.put(getAsciiString(server)); + data.put(getAsciiString(creo.getCustomName())); + } + }*/ + + data.putInt(0); + /*if (room.getUserList().size() > 0) { + for (CreatureObject creo : room.getUserList()) { + data.put(getAsciiString("SWG")); + data.put(getAsciiString(server)); + data.put(getAsciiString(creo.getCustomName())); + } + }*/ + + data.putInt(requestId); + return data.flip(); } } diff --git a/src/protocol/swg/ChatOnEnteredRoom.java b/src/protocol/swg/ChatOnEnteredRoom.java index b040c1bf..179f981a 100644 --- a/src/protocol/swg/ChatOnEnteredRoom.java +++ b/src/protocol/swg/ChatOnEnteredRoom.java @@ -62,6 +62,7 @@ public class ChatOnEnteredRoom extends SWGMessage { buffer.put(getAsciiString(characterName)); buffer.putInt(success); buffer.putInt(roomId); + buffer.putInt(0); return buffer.flip(); } diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 562686dc..8d4a159f 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -49,6 +49,7 @@ import resources.common.*; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import protocol.swg.AddIgnoreMessage; +import protocol.swg.ChatCreateRoom; import protocol.swg.ChatEnterRoomById; import protocol.swg.ChatOnChangeFriendStatus; import protocol.swg.ChatDeletePersistentMessage; @@ -56,6 +57,7 @@ import protocol.swg.ChatFriendsListUpdate; import protocol.swg.ChatInstantMessageToCharacter; import protocol.swg.ChatInstantMessagetoClient; import protocol.swg.ChatOnAddFriend; +import protocol.swg.ChatOnCreateRoom; import protocol.swg.ChatOnEnteredRoom; import protocol.swg.ChatOnSendInstantMessage; import protocol.swg.ChatOnSendPersistentMessage; @@ -369,13 +371,37 @@ public class ChatService implements INetworkDispatch { }); swgOpcodes.put(Opcodes.ChatCreateRoom, (session, data) -> { - //System.out.println("CREATE:"); - //StringUtilities.printBytes(data.array()); + data.order(ByteOrder.LITTLE_ENDIAN); + + Client client = core.getClient(session); + + if(client == null) + return; + + SWGObject obj = client.getParent(); + + if (obj == null) + return; + + CreatureObject creo = (CreatureObject) obj; + + ChatCreateRoom sentPacket = new ChatCreateRoom(); + sentPacket.deserialize(data); + + ChatRoom room = createChatRoom(sentPacket.getTitle(), sentPacket.getAddress(), creo.getCustomName().toLowerCase(), true, false); + room.setPrivateRoom(sentPacket.isPrivacy()); + room.setModeratorsOnly(sentPacket.isModeratorOnly()); + + if (room != null) { + room.getUserList().add(creo); + room.getModeratorList().add(creo); + ChatOnCreateRoom response = new ChatOnCreateRoom(room, 0, sentPacket.getRequest()); + session.write(response.serialize()); + } + }); swgOpcodes.put(Opcodes.ChatQueryRoom, (session, data) -> { - //System.out.println("QUERY: "); - //StringUtilities.printBytes(data.array()); }); swgOpcodes.put(Opcodes.ChatSendToRoom, (session, data) -> { @@ -408,13 +434,14 @@ public class ChatService implements INetworkDispatch { if (obj == null) return; - + data.order(ByteOrder.LITTLE_ENDIAN); + data.position(0); ChatEnterRoomById sentPacket = new ChatEnterRoomById(); sentPacket.deserialize(data); joinChatRoom((CreatureObject) obj, sentPacket.getRoomId()); - //System.out.println("Entering room..."); + System.out.println("Entering room... " + sentPacket.getRoomId()); }); } @@ -684,7 +711,7 @@ public class ChatService implements INetworkDispatch { } private void loadChatRooms() { - ChatRoom system = createChatRoom("Waves Dungeon", "ProjectSWGTest.Dungeon", "Waverunner", true); + ChatRoom system = createChatRoom("", "Chat", "system", true); chatRooms.put(system.getRoomId(), system); EntityCursor cursor = chatRoomsODB.getCursor(Integer.class, ChatRoom.class); @@ -704,7 +731,10 @@ public class ChatService implements INetworkDispatch { ChatRoom room = new ChatRoom(); room.setDescription(roomName); - room.setRoomAddress("SWG." + core.getGalaxyName() + "." + address); + if (!address.startsWith("SWG.")) + room.setRoomAddress("SWG." + core.getGalaxyName() + "." + address); + else + room.setRoomAddress(address); room.setCreator(creator); room.setOwner(creator); room.setVisible(showInList);