From 90fb606f68564f0c4042b279ba326b40579e03bd Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Sun, 2 Apr 2023 21:23:02 -0400 Subject: [PATCH] Simplify the mail handler --- .../java/emu/grasscutter/game/mail/Mail.java | 20 ++++++---- .../packet/recv/HandlerGetAllMailNotify.java | 38 ++---------------- .../send/PacketGetAllMailResultNotify.java | 40 ++++++++++++++----- 3 files changed, 45 insertions(+), 53 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/mail/Mail.java b/src/main/java/emu/grasscutter/game/mail/Mail.java index 5ddbcfa34..7c599f077 100644 --- a/src/main/java/emu/grasscutter/game/mail/Mail.java +++ b/src/main/java/emu/grasscutter/game/mail/Mail.java @@ -7,15 +7,19 @@ import dev.morphia.annotations.Transient; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.player.Player; import emu.grasscutter.net.proto.*; -import emu.grasscutter.utils.Utils; +import emu.grasscutter.net.proto.EquipParamOuterClass.EquipParam; +import emu.grasscutter.net.proto.MailCollectStateOuterClass.MailCollectState; +import emu.grasscutter.net.proto.MailTextContentOuterClass.MailTextContent; import org.bson.types.ObjectId; import java.time.Instant; import java.util.ArrayList; import java.util.List; +import static emu.grasscutter.net.proto.MailItemOuterClass.MailItem.*; + @Entity(value = "mail", useDiscriminator = false) -public class Mail { +public final class Mail { @Id private ObjectId id; @Indexed private int ownerUid; public MailContent mailContent; @@ -73,7 +77,7 @@ public class Mail { .setImportance(this.importance) .setIsRead(this.isRead) .setIsAttachmentGot(this.isAttachmentGot) - .setCollectState(MailCollectStateOuterClass.MailCollectState.MAIL_COLLECT_STATE_NOT_COLLECTIBLE) + .setCollectState(MailCollectState.MAIL_COLLECT_STATE_NOT_COLLECTIBLE) .build(); } @@ -103,8 +107,8 @@ public class Mail { this.sender = sender; } - public MailTextContentOuterClass.MailTextContent toProto() { - return MailTextContentOuterClass.MailTextContent.newBuilder() + public MailTextContent toProto() { + return MailTextContent.newBuilder() .setTitle(this.title) .setContent(this.content) .setSender(this.sender) @@ -139,13 +143,13 @@ public class Mail { } public MailItemOuterClass.MailItem toProto() { - return MailItemOuterClass.MailItem.newBuilder() - .setEquipParam(Utils.make(() -> EquipParamOuterClass.EquipParam.newBuilder() + return newBuilder().setEquipParam(EquipParam.newBuilder() .setItemId(this.itemId) .setItemNum(this.itemCount) .setItemLevel(this.itemLevel) .setPromoteLevel(0)//mock - .build())).build(); + .build()) + .build(); } } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllMailNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllMailNotify.java index c3178a624..9ccbcfdc4 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllMailNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetAllMailNotify.java @@ -1,47 +1,17 @@ package emu.grasscutter.server.packet.recv; -import emu.grasscutter.game.player.Player; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.proto.GetAllMailNotifyOuterClass; +import emu.grasscutter.net.proto.GetAllMailNotifyOuterClass.GetAllMailNotify; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.packet.send.PacketGetAllMailResultNotify; -import emu.grasscutter.utils.Utils; - -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; @Opcodes(PacketOpcodes.GetAllMailNotify) -public class HandlerGetAllMailNotify extends PacketHandler { - private static final int MAX_MAIL_DATA_NUM_PER_PACKET = 40; - - private static void subdivide(Player player) { - var notGiftedMails = player.getAllMail().stream().filter(mail -> mail.stateValue == 1).toList(); - var packetsBeSent = notGiftedMails.size() / MAX_MAIL_DATA_NUM_PER_PACKET + 1; - var curPacketNum = new AtomicInteger(1); - for (int i = 0; i < packetsBeSent; i++) { - player.sendPacket(new PacketGetAllMailResultNotify(packetsBeSent, curPacketNum.get(), Utils.make(() -> { - var index = (curPacketNum.get() - 1) * MAX_MAIL_DATA_NUM_PER_PACKET; - return notGiftedMails.subList(index, curPacketNum.get() == packetsBeSent ? notGiftedMails.size() - 1 : index + MAX_MAIL_DATA_NUM_PER_PACKET - 1); - }).stream().map(mail -> mail.toProto(player)).toList(), createTransaction(player), false)); - curPacketNum.incrementAndGet(); - } - } - - private static String createTransaction(Player player) { - return player.getUid() + "-" + Utils.getCurrentSeconds() + "-" + 0;//mock - } - +public final class HandlerGetAllMailNotify extends PacketHandler { @Override public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { - var req = GetAllMailNotifyOuterClass.GetAllMailNotify.parseFrom(payload); - var gift = req.getIsCollected(); - if (gift) { - session.send(new PacketGetAllMailResultNotify(1, 1, List.of(), "", true)); - return; - } - - subdivide(session.getPlayer()); + var req = GetAllMailNotify.parseFrom(payload); + session.send(new PacketGetAllMailResultNotify(session.getPlayer(), req.getIsCollected())); } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetAllMailResultNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetAllMailResultNotify.java index 15bb0993a..87689de28 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetAllMailResultNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetAllMailResultNotify.java @@ -1,22 +1,40 @@ package emu.grasscutter.server.packet.send; +import emu.grasscutter.game.player.Player; import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.proto.GetAllMailResultNotifyOuterClass; -import emu.grasscutter.net.proto.MailDataOuterClass; +import emu.grasscutter.net.proto.GetAllMailResultNotifyOuterClass.GetAllMailResultNotify; +import emu.grasscutter.utils.Utils; +import java.time.Instant; import java.util.List; -public class PacketGetAllMailResultNotify extends BasePacket { - public PacketGetAllMailResultNotify(int packetBeSentNum, int packetNum, List mailData, String transaction, boolean isGift) { +public final class PacketGetAllMailResultNotify extends BasePacket { + /** + * @param player The player to fetch the mail for. + * @param gifts Is the mail for gifts? + */ + public PacketGetAllMailResultNotify(Player player, boolean gifts) { super(PacketOpcodes.GetAllMailResultNotify); - this.setData(GetAllMailResultNotifyOuterClass.GetAllMailResultNotify.newBuilder() - .setPacketBeSentNum(packetBeSentNum) - .addAllMailList(mailData) - .setTransaction(transaction) - .setIsCollected(isGift) - .setPacketNum(packetNum) - .build()); + var packet = GetAllMailResultNotify.newBuilder() + .setTransaction(player.getUid() + "-" + Utils.getCurrentSeconds() + "-" + 0) + .setIsCollected(gifts) + .setPacketBeSentNum(1) + .setPacketNum(1); + + var inbox = player.getAllMail(); + if (!gifts && inbox.size() > 0) { + packet.addAllMailList(inbox.stream() + .filter(mail -> mail.stateValue == 1) + .filter(mail -> mail.expireTime > Instant.now().getEpochSecond()) + .map(mail -> mail.toProto(player)).toList()); + } else { + // Empty mailbox. + // TODO: Implement the gift mailbox. + packet.addAllMailList(List.of()); + } + + this.setData(packet.build()); } }