From 7e33c180638bce475b96038f0557940729990cd8 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:44:39 -0700 Subject: [PATCH] Implement `GetPrivateChatHistoryCsReq` Pretty useless on private servers but oh well --- .../java/emu/lunarcore/GameConstants.java | 2 + .../emu/lunarcore/game/chat/ChatManager.java | 90 +++++++++++++++++++ .../emu/lunarcore/game/chat/ChatMessage.java | 48 ++++++++++ .../emu/lunarcore/game/player/Player.java | 7 +- .../lunarcore/game/service/ChatService.java | 46 ---------- .../emu/lunarcore/server/game/GameServer.java | 3 - .../HandlerGetPrivateChatHistoryCsReq.java | 22 +++++ .../packet/recv/HandlerSendMsgCsReq.java | 4 +- .../PacketGetPrivateChatHistoryScRsp.java | 26 ++++++ .../packet/send/PacketRevcMsgScNotify.java | 20 +++-- 10 files changed, 209 insertions(+), 59 deletions(-) create mode 100644 src/main/java/emu/lunarcore/game/chat/ChatManager.java create mode 100644 src/main/java/emu/lunarcore/game/chat/ChatMessage.java delete mode 100644 src/main/java/emu/lunarcore/game/service/ChatService.java create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPrivateChatHistoryCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketGetPrivateChatHistoryScRsp.java diff --git a/src/main/java/emu/lunarcore/GameConstants.java b/src/main/java/emu/lunarcore/GameConstants.java index f3c4697..4509f79 100644 --- a/src/main/java/emu/lunarcore/GameConstants.java +++ b/src/main/java/emu/lunarcore/GameConstants.java @@ -18,6 +18,8 @@ public class GameConstants { public static final int DEFAULT_TEAMS = 6; public static final int MAX_MP = 5; // Client doesnt like more than 5 + public static final int MAX_CHAT_HISTORY = 100; // Max chat messages per conversation + // Custom public static final int SERVER_CONSOLE_UID = 99; public static final int EQUIPMENT_SLOT_ID = 100; diff --git a/src/main/java/emu/lunarcore/game/chat/ChatManager.java b/src/main/java/emu/lunarcore/game/chat/ChatManager.java new file mode 100644 index 0000000..b1845fa --- /dev/null +++ b/src/main/java/emu/lunarcore/game/chat/ChatManager.java @@ -0,0 +1,90 @@ +package emu.lunarcore.game.chat; + +import java.util.Collection; + +import emu.lunarcore.GameConstants; +import emu.lunarcore.commands.PlayerCommands; +import emu.lunarcore.game.player.BasePlayerManager; +import emu.lunarcore.game.player.Player; +import emu.lunarcore.server.packet.send.PacketRevcMsgScNotify; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectList; +import lombok.AccessLevel; +import lombok.Getter; + +public class ChatManager extends BasePlayerManager { + @Getter(AccessLevel.PRIVATE) + private final Int2ObjectMap> history; + + public ChatManager(Player player) { + super(player); + this.history = new Int2ObjectOpenHashMap<>(); + } + + public Collection getHistoryByUid(int uid) { + return getHistory().get(uid); + } + + public void addChatMessage(ChatMessage message) { + // Get sender + int targetPlayerUid = this.getPlayer().getUid() == message.getToUid() ? message.getFromUid() : message.getToUid(); + // Add to chat history + if (GameConstants.MAX_CHAT_HISTORY > 0) { + // Add to history list + var list = getHistory().computeIfAbsent(targetPlayerUid, id -> new ObjectArrayList<>()); + list.add(message); + // Check max size + while (list.size() >= GameConstants.MAX_CHAT_HISTORY) { + list.remove(0); + } + } + // Send to client + getPlayer().sendPacket(new PacketRevcMsgScNotify(message)); + } + + public void sendChat(int targetUid, String text) { + // Sanity checks + if (text == null || text.length() == 0) { + return; + } + + // Check if command + if (text.charAt(0) == '!' || text.charAt(0) == '/') { + PlayerCommands.handle(getPlayer(), text); + return; + } + + // Get target + Player target = getPlayer().getServer().getOnlinePlayerByUid(targetUid); + + if (target == null) { + return; + } + + // Create chat packet + ChatMessage message = new ChatMessage(this.getPlayer().getUid(), targetUid, text); + + // Send to both players + this.addChatMessage(message); + target.getChatManager().addChatMessage(message); + } + + public void sendChat(int targetUid, int emote) { + // Get target + Player target = getPlayer().getServer().getOnlinePlayerByUid(targetUid); + + if (target == null) { + return; + } + + // Create chat packet + ChatMessage message = new ChatMessage(this.getPlayer().getUid(), targetUid, emote); + + // Send to both players + this.addChatMessage(message); + target.getChatManager().addChatMessage(message); + } + +} diff --git a/src/main/java/emu/lunarcore/game/chat/ChatMessage.java b/src/main/java/emu/lunarcore/game/chat/ChatMessage.java new file mode 100644 index 0000000..c8b136b --- /dev/null +++ b/src/main/java/emu/lunarcore/game/chat/ChatMessage.java @@ -0,0 +1,48 @@ +package emu.lunarcore.game.chat; + +import emu.lunarcore.proto.ChatOuterClass.Chat; +import emu.lunarcore.proto.MsgTypeOuterClass.MsgType; +import lombok.Getter; + +@Getter +public class ChatMessage { + private int fromUid; + private int toUid; + private String text; + private int emote; + private long time; + + public ChatMessage(int fromUid, int toUid) { + this.fromUid = fromUid; + this.toUid = toUid; + this.time = System.currentTimeMillis() / 1000; + } + + public ChatMessage(int fromUid, int toUid, String text) { + this(fromUid, toUid); + this.text = text; + } + + public ChatMessage(int fromUid, int toUid, int emote) { + this(fromUid, toUid); + this.emote = emote; + } + + public MsgType getType() { + return this.getText() != null ? MsgType.MSG_TYPE_CUSTOM_TEXT : MsgType.MSG_TYPE_EMOJI; + } + + public Chat toProto() { + var proto = Chat.newInstance() + .setSenderUid(this.getFromUid()) + .setSentTime(this.getTime()) + .setMsgType(this.getType()) + .setEmote(this.getEmote()); + + if (this.getText() != null) { + proto.setText(text); + } + + return proto; + } +} diff --git a/src/main/java/emu/lunarcore/game/player/Player.java b/src/main/java/emu/lunarcore/game/player/Player.java index 4256b84..9929725 100644 --- a/src/main/java/emu/lunarcore/game/player/Player.java +++ b/src/main/java/emu/lunarcore/game/player/Player.java @@ -20,6 +20,8 @@ import emu.lunarcore.game.avatar.AvatarStorage; import emu.lunarcore.game.avatar.GameAvatar; import emu.lunarcore.game.avatar.HeroPath; import emu.lunarcore.game.battle.Battle; +import emu.lunarcore.game.chat.ChatManager; +import emu.lunarcore.game.chat.ChatMessage; import emu.lunarcore.game.gacha.PlayerGachaInfo; import emu.lunarcore.game.inventory.Inventory; import emu.lunarcore.game.scene.Scene; @@ -73,6 +75,7 @@ public class Player { private transient GameSession session; private transient final AvatarStorage avatars; private transient final Inventory inventory; + private transient final ChatManager chatManager; // Database persistent data private LineupManager lineupManager; @@ -89,6 +92,7 @@ public class Player { this.gender = PlayerGender.GENDER_MAN; this.avatars = new AvatarStorage(this); this.inventory = new Inventory(this); + this.chatManager = new ChatManager(this); } // Called when player is created @@ -425,7 +429,8 @@ public class Player { } public void dropMessage(String message) { - this.sendPacket(new PacketRevcMsgScNotify(this, message)); + var msg = new ChatMessage(GameConstants.SERVER_CONSOLE_UID, this.getUid(), message); + this.getChatManager().addChatMessage(msg); } public void sendPacket(BasePacket packet) { diff --git a/src/main/java/emu/lunarcore/game/service/ChatService.java b/src/main/java/emu/lunarcore/game/service/ChatService.java deleted file mode 100644 index cdd8d8d..0000000 --- a/src/main/java/emu/lunarcore/game/service/ChatService.java +++ /dev/null @@ -1,46 +0,0 @@ -package emu.lunarcore.game.service; - -import emu.lunarcore.commands.PlayerCommands; -import emu.lunarcore.game.player.Player; -import emu.lunarcore.server.game.BaseGameService; -import emu.lunarcore.server.game.GameServer; - -public class ChatService extends BaseGameService { - - public ChatService(GameServer server) { - super(server); - } - - public void sendPrivChat(Player player, int targetUid, String message) { - // Sanity checks - if (message == null || message.length() == 0) { - return; - } - - // Check if command - if (message.charAt(0) == '!') { - PlayerCommands.handle(player, message); - return; - } - - // Get target - Player target = getServer().getOnlinePlayerByUid(targetUid); - - if (target == null) { - return; - } - - // Create chat packet TODO - } - - public void sendPrivChat(Player player, int targetUid, int emote) { - // Get target - Player target = getServer().getOnlinePlayerByUid(targetUid); - - if (target == null) { - return; - } - - // Create chat packet TODO - } -} diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java index cb620fb..d82f9e0 100644 --- a/src/main/java/emu/lunarcore/server/game/GameServer.java +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -10,7 +10,6 @@ import emu.lunarcore.game.battle.BattleService; import emu.lunarcore.game.challenge.ChallengeService; import emu.lunarcore.game.gacha.GachaService; import emu.lunarcore.game.player.Player; -import emu.lunarcore.game.service.ChatService; import emu.lunarcore.game.service.InventoryService; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; @@ -32,7 +31,6 @@ public class GameServer extends KcpServer { @Getter private final BattleService battleService; @Getter private final InventoryService inventoryService; @Getter private final GachaService gachaService; - @Getter private final ChatService chatService; @Getter private final ChallengeService challengeService; public GameServer(GameServerConfig serverConfig) { @@ -48,7 +46,6 @@ public class GameServer extends KcpServer { this.battleService = new BattleService(this); this.inventoryService = new InventoryService(this); this.gachaService = new GachaService(this); - this.chatService = new ChatService(this); this.challengeService = new ChallengeService(this); // Hook into shutdown event. diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPrivateChatHistoryCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPrivateChatHistoryCsReq.java new file mode 100644 index 0000000..0712c01 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerGetPrivateChatHistoryCsReq.java @@ -0,0 +1,22 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.GetPrivateChatHistoryCsReqOuterClass.GetPrivateChatHistoryCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketGetPrivateChatHistoryScRsp; + +@Opcodes(CmdId.GetPrivateChatHistoryCsReq) +public class HandlerGetPrivateChatHistoryCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = GetPrivateChatHistoryCsReq.parseFrom(data); + + var messages = session.getPlayer().getChatManager().getHistoryByUid(req.getToUid()); + + session.send(new PacketGetPrivateChatHistoryScRsp(req.getToUid(), messages)); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java index 285ed59..f4dae18 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSendMsgCsReq.java @@ -17,9 +17,9 @@ public class HandlerSendMsgCsReq extends PacketHandler { for (int targetUid : req.getToUid()) { if (req.getMsgType() == MsgType.MSG_TYPE_CUSTOM_TEXT) { - session.getServer().getChatService().sendPrivChat(session.getPlayer(), targetUid, req.getText()); + session.getPlayer().getChatManager().sendChat(targetUid, req.getText()); } else if (req.getMsgType() == MsgType.MSG_TYPE_EMOJI) { - session.getServer().getChatService().sendPrivChat(session.getPlayer(), targetUid, req.getEmote()); + session.getPlayer().getChatManager().sendChat(targetUid, req.getEmote()); } } diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketGetPrivateChatHistoryScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketGetPrivateChatHistoryScRsp.java new file mode 100644 index 0000000..0013a22 --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketGetPrivateChatHistoryScRsp.java @@ -0,0 +1,26 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.chat.ChatMessage; +import emu.lunarcore.proto.GetPrivateChatHistoryScRspOuterClass.GetPrivateChatHistoryScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketGetPrivateChatHistoryScRsp extends BasePacket { + + public PacketGetPrivateChatHistoryScRsp(int targetUid, Collection messages) { + super(CmdId.GetPrivateChatHistoryScRsp); + + var data = GetPrivateChatHistoryScRsp.newInstance() + .setToUid(targetUid); + + if (messages != null) { + for (var message : messages) { + data.addChatList(message.toProto()); + } + } + + this.setData(data); + } +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java b/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java index 2c38ecc..fad61e5 100644 --- a/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketRevcMsgScNotify.java @@ -1,7 +1,6 @@ package emu.lunarcore.server.packet.send; -import emu.lunarcore.GameConstants; -import emu.lunarcore.game.player.Player; +import emu.lunarcore.game.chat.ChatMessage; import emu.lunarcore.proto.ChatTypeOuterClass.ChatType; import emu.lunarcore.proto.MsgTypeOuterClass.MsgType; import emu.lunarcore.proto.RevcMsgScNotifyOuterClass.RevcMsgScNotify; @@ -10,15 +9,22 @@ import emu.lunarcore.server.packet.CmdId; public class PacketRevcMsgScNotify extends BasePacket { - public PacketRevcMsgScNotify(Player player, String msg) { + public PacketRevcMsgScNotify(ChatMessage message) { super(CmdId.RevcMsgScNotify); var data = RevcMsgScNotify.newInstance() - .setText(msg) .setChatType(ChatType.CHAT_TYPE_PRIVATE) - .setMsgType(MsgType.MSG_TYPE_CUSTOM_TEXT) - .setFromUid(GameConstants.SERVER_CONSOLE_UID) - .setToUid(player.getUid()); + .setFromUid(message.getFromUid()) + .setToUid(message.getToUid()); + + MsgType msgType = message.getType(); + data.setMsgType(msgType); + + if (msgType == MsgType.MSG_TYPE_CUSTOM_TEXT) { + data.setText(message.getText()); + } else { + data.setEmote(message.getEmote()); + } this.setData(data); }