mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-30 18:42:12 +00:00
Deleting mail + a bit of cleanup
This commit is contained in:
parent
ced5fc38be
commit
15d1159509
@ -1,5 +1,8 @@
|
|||||||
package emu.grasscutter.game;
|
package emu.grasscutter.game;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import dev.morphia.annotations.*;
|
import dev.morphia.annotations.*;
|
||||||
import emu.grasscutter.GenshinConstants;
|
import emu.grasscutter.GenshinConstants;
|
||||||
import emu.grasscutter.Grasscutter;
|
import emu.grasscutter.Grasscutter;
|
||||||
@ -588,8 +591,9 @@ public class GenshinPlayer {
|
|||||||
Mail message = getMailById(mailId);
|
Mail message = getMailById(mailId);
|
||||||
|
|
||||||
if(message != null) {
|
if(message != null) {
|
||||||
this.mail.remove(message);
|
int index = getMailIndex(message);
|
||||||
this.save();
|
message.expireTime = (int) Instant.now().getEpochSecond(); // Just set the mail as expired for now. I don't want to implement a counter specifically for an account...
|
||||||
|
this.replaceMailByIndex(index, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,9 +608,10 @@ public class GenshinPlayer {
|
|||||||
return this.mail.indexOf(message);
|
return this.mail.indexOf(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean replaceMailByIndex(int mailId, Mail message) {
|
public boolean replaceMailByIndex(int index, Mail message) {
|
||||||
if(getMailById(mailId) != null) {
|
if(getMailById(index) != null) {
|
||||||
this.mail.set(mailId, message);
|
this.mail.set(index, message);
|
||||||
|
this.save();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -25,14 +25,14 @@ public class Mail {
|
|||||||
itemList = new ArrayList<>();
|
itemList = new ArrayList<>();
|
||||||
sendTime = 0;
|
sendTime = 0;
|
||||||
expireTime = 0;
|
expireTime = 0;
|
||||||
importance = 1;
|
importance = 0; // Starred mail, 0 = No star, 1 = Star.
|
||||||
isRead = true;
|
isRead = true;
|
||||||
isAttachmentGot = true;
|
isAttachmentGot = true;
|
||||||
stateValue = 1;
|
stateValue = 1; // Different mailboxes, 1 = Default, 3 = Gift-box.
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mail(MailContent mailContent, List<MailItem> itemList, long expireTime) {
|
public Mail(MailContent mailContent, List<MailItem> itemList, long expireTime) {
|
||||||
this(mailContent, itemList, expireTime, 1);
|
this(mailContent, itemList, expireTime, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mail(MailContent mailContent, List<MailItem> itemList, long expireTime, int importance) {
|
public Mail(MailContent mailContent, List<MailItem> itemList, long expireTime, int importance) {
|
||||||
@ -90,19 +90,24 @@ public class Mail {
|
|||||||
public static class MailItem {
|
public static class MailItem {
|
||||||
public int itemId;
|
public int itemId;
|
||||||
public int itemCount;
|
public int itemCount;
|
||||||
|
public int itemLevel;
|
||||||
|
|
||||||
public MailItem() {
|
public MailItem() {
|
||||||
this.itemId = 11101;
|
this.itemId = 11101;
|
||||||
this.itemCount = 1;
|
this.itemCount = 1;
|
||||||
|
this.itemLevel = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MailItem(int itemId) {
|
public MailItem(int itemId) {
|
||||||
this(itemId, 1);
|
this(itemId, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MailItem(int itemId, int itemCount) {
|
public MailItem(int itemId, int itemCount) { this(itemId, itemCount, 1); }
|
||||||
|
|
||||||
|
public MailItem(int itemId, int itemCount, int itemLevel) {
|
||||||
this.itemId = itemId;
|
this.itemId = itemId;
|
||||||
this.itemCount = itemCount;
|
this.itemCount = itemCount;
|
||||||
|
this.itemLevel = itemLevel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package emu.grasscutter.server.packet.recv;
|
||||||
|
|
||||||
|
import emu.grasscutter.net.packet.Opcodes;
|
||||||
|
import emu.grasscutter.net.packet.PacketHandler;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.net.proto.DelMailReqOuterClass;
|
||||||
|
import emu.grasscutter.net.proto.DeleteFriendReqOuterClass;
|
||||||
|
import emu.grasscutter.server.game.GameSession;
|
||||||
|
import emu.grasscutter.server.packet.send.PacketDelMailRsp;
|
||||||
|
|
||||||
|
@Opcodes(PacketOpcodes.DelMailReq)
|
||||||
|
public class HandlerDelMailReq extends PacketHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||||
|
DelMailReqOuterClass.DelMailReq req = DelMailReqOuterClass.DelMailReq.parseFrom(payload);
|
||||||
|
|
||||||
|
session.send(new PacketDelMailRsp(session.getPlayer(), req.getMailIdListList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package emu.grasscutter.server.packet.send;
|
||||||
|
|
||||||
|
import emu.grasscutter.game.GenshinPlayer;
|
||||||
|
import emu.grasscutter.net.packet.GenshinPacket;
|
||||||
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
|
import emu.grasscutter.net.proto.DelMailRspOuterClass.DelMailRsp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class PacketDelMailRsp extends GenshinPacket {
|
||||||
|
|
||||||
|
public PacketDelMailRsp(GenshinPlayer player, List<Integer> toDeleteIds) {
|
||||||
|
super(PacketOpcodes.DelMailRsp);
|
||||||
|
|
||||||
|
DelMailRsp.Builder proto = DelMailRsp.newBuilder();
|
||||||
|
|
||||||
|
List<Integer> deletedIds = new ArrayList<>();
|
||||||
|
|
||||||
|
for(int mailId : toDeleteIds) {
|
||||||
|
if(player.deleteMail(mailId)) {
|
||||||
|
deletedIds.add(mailId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setData(proto.build());
|
||||||
|
player.getSession().send(new PacketMailChangeNotify(player, null, deletedIds));
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ import emu.grasscutter.net.proto.MailDataOuterClass.MailData;
|
|||||||
import emu.grasscutter.net.proto.MailItemOuterClass;
|
import emu.grasscutter.net.proto.MailItemOuterClass;
|
||||||
import emu.grasscutter.net.proto.MailTextContentOuterClass.MailTextContent;
|
import emu.grasscutter.net.proto.MailTextContentOuterClass.MailTextContent;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -38,41 +39,45 @@ public class PacketGetAllMailRsp extends GenshinPacket {
|
|||||||
List<MailData> mailDataList = new ArrayList<MailData>();
|
List<MailData> mailDataList = new ArrayList<MailData>();
|
||||||
|
|
||||||
for (Mail message : player.getAllMail()) {
|
for (Mail message : player.getAllMail()) {
|
||||||
if(message.stateValue == 1) { //Make sure it isn't a gift
|
if(message.stateValue == 1) { // Make sure it isn't a gift
|
||||||
MailTextContent.Builder mailTextContent = MailTextContent.newBuilder();
|
if (message.expireTime < Instant.now().getEpochSecond()) { // Make sure the message isn't expired (The game won't show expired mail, but I don't want to send unnecessary information).
|
||||||
mailTextContent.setTitle(message.mailContent.title);
|
if(mailDataList.size() <= 1000) { // Make sure that there isn't over 1000 messages in the mailbox. (idk what will happen if there is but the game probably won't like it.)
|
||||||
mailTextContent.setContent(message.mailContent.content);
|
MailTextContent.Builder mailTextContent = MailTextContent.newBuilder();
|
||||||
mailTextContent.setSender(message.mailContent.sender);
|
mailTextContent.setTitle(message.mailContent.title);
|
||||||
|
mailTextContent.setContent(message.mailContent.content);
|
||||||
|
mailTextContent.setSender(message.mailContent.sender);
|
||||||
|
|
||||||
List<MailItemOuterClass.MailItem> mailItems = new ArrayList<>();
|
List<MailItemOuterClass.MailItem> mailItems = new ArrayList<>();
|
||||||
|
|
||||||
for (Mail.MailItem item : message.itemList) {
|
for (Mail.MailItem item : message.itemList) {
|
||||||
MailItemOuterClass.MailItem.Builder mailItem = MailItemOuterClass.MailItem.newBuilder();
|
MailItemOuterClass.MailItem.Builder mailItem = MailItemOuterClass.MailItem.newBuilder();
|
||||||
ItemParamOuterClass.ItemParam.Builder itemParam = ItemParamOuterClass.ItemParam.newBuilder();
|
ItemParamOuterClass.ItemParam.Builder itemParam = ItemParamOuterClass.ItemParam.newBuilder();
|
||||||
itemParam.setItemId(item.itemId);
|
itemParam.setItemId(item.itemId);
|
||||||
itemParam.setCount(item.itemCount);
|
itemParam.setCount(item.itemCount);
|
||||||
mailItem.setItemParam(itemParam.build());
|
mailItem.setItemParam(itemParam.build());
|
||||||
|
|
||||||
mailItems.add(mailItem.build());
|
mailItems.add(mailItem.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
MailDataOuterClass.MailData.Builder mailData = MailDataOuterClass.MailData.newBuilder();
|
||||||
|
mailData.setMailId(message._id);
|
||||||
|
mailData.setMailTextContent(mailTextContent.build());
|
||||||
|
mailData.addAllItemList(mailItems);
|
||||||
|
mailData.setSendTime((int) message.sendTime);
|
||||||
|
mailData.setExpireTime((int) message.expireTime);
|
||||||
|
mailData.setImportance(message.importance);
|
||||||
|
mailData.setIsRead(message.isRead);
|
||||||
|
mailData.setIsAttachmentGot(message.isAttachmentGot);
|
||||||
|
mailData.setStateValue(1);
|
||||||
|
|
||||||
|
mailDataList.add(mailData.build());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MailDataOuterClass.MailData.Builder mailData = MailDataOuterClass.MailData.newBuilder();
|
|
||||||
mailData.setMailId(message._id);
|
|
||||||
mailData.setMailTextContent(mailTextContent.build());
|
|
||||||
mailData.addAllItemList(mailItems);
|
|
||||||
mailData.setSendTime((int) message.sendTime);
|
|
||||||
mailData.setExpireTime((int) message.expireTime);
|
|
||||||
mailData.setImportance(message.importance);
|
|
||||||
mailData.setIsRead(message.isRead);
|
|
||||||
mailData.setIsAttachmentGot(message.isAttachmentGot);
|
|
||||||
mailData.setStateValue(1);
|
|
||||||
|
|
||||||
mailDataList.add(mailData.build());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
proto.addAllMailList(mailDataList);
|
proto.addAllMailList(mailDataList);
|
||||||
proto.setIsTruncated(false); // When enabled this will send a notification to the user that their inbox is full when opening the mailbox.
|
proto.setIsTruncated(mailDataList.size() <= 1000 ? false : true); // When enabled this will send a notification to the user telling them their inbox is full and they should delete old messages when opening the mailbox.
|
||||||
|
|
||||||
this.setData(proto.build());
|
this.setData(proto.build());
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package emu.grasscutter.server.packet.send;
|
package emu.grasscutter.server.packet.send;
|
||||||
|
|
||||||
import emu.grasscutter.Grasscutter;
|
|
||||||
import emu.grasscutter.data.GenshinData;
|
import emu.grasscutter.data.GenshinData;
|
||||||
import emu.grasscutter.game.GenshinPlayer;
|
import emu.grasscutter.game.GenshinPlayer;
|
||||||
import emu.grasscutter.game.Mail;
|
import emu.grasscutter.game.Mail;
|
||||||
@ -10,8 +9,6 @@ import emu.grasscutter.net.packet.GenshinPacket;
|
|||||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||||
import emu.grasscutter.net.proto.EquipParamOuterClass;
|
import emu.grasscutter.net.proto.EquipParamOuterClass;
|
||||||
import emu.grasscutter.net.proto.GetMailItemRspOuterClass.GetMailItemRsp;
|
import emu.grasscutter.net.proto.GetMailItemRspOuterClass.GetMailItemRsp;
|
||||||
import emu.grasscutter.net.proto.ItemParamOuterClass;
|
|
||||||
import emu.grasscutter.net.proto.MailItemOuterClass;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -22,9 +19,6 @@ public class PacketGetMailItemRsp extends GenshinPacket {
|
|||||||
public PacketGetMailItemRsp(GenshinPlayer player, List<Integer> mailList) {
|
public PacketGetMailItemRsp(GenshinPlayer player, List<Integer> mailList) {
|
||||||
super(PacketOpcodes.GetMailItemRsp);
|
super(PacketOpcodes.GetMailItemRsp);
|
||||||
|
|
||||||
//I'm assuming that this is to receive the attachments on the message.
|
|
||||||
// TODO: This.
|
|
||||||
|
|
||||||
List<Mail> claimedMessages = new ArrayList<>();
|
List<Mail> claimedMessages = new ArrayList<>();
|
||||||
List<EquipParamOuterClass.EquipParam> claimedItems = new ArrayList<>();
|
List<EquipParamOuterClass.EquipParam> claimedItems = new ArrayList<>();
|
||||||
|
|
||||||
@ -34,13 +28,7 @@ public class PacketGetMailItemRsp extends GenshinPacket {
|
|||||||
Mail message = player.getMailById(mailId);
|
Mail message = player.getMailById(mailId);
|
||||||
int messageIndex = player.getMailIndex(message);
|
int messageIndex = player.getMailIndex(message);
|
||||||
|
|
||||||
message.isAttachmentGot = true;
|
|
||||||
claimedMessages.add(message);
|
|
||||||
|
|
||||||
player.replaceMailByIndex(messageIndex, message);
|
|
||||||
|
|
||||||
for(Mail.MailItem mailItem : message.itemList) {
|
for(Mail.MailItem mailItem : message.itemList) {
|
||||||
//TODO: Actually give the item
|
|
||||||
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder();
|
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder();
|
||||||
item.setItemId(mailItem.itemId);
|
item.setItemId(mailItem.itemId);
|
||||||
item.setItemNum(mailItem.itemCount);
|
item.setItemNum(mailItem.itemCount);
|
||||||
@ -51,14 +39,17 @@ public class PacketGetMailItemRsp extends GenshinPacket {
|
|||||||
player.getInventory().addItem(genshinItem);
|
player.getInventory().addItem(genshinItem);
|
||||||
player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.MailAttachment));
|
player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.MailAttachment));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message.isAttachmentGot = true;
|
||||||
|
claimedMessages.add(message);
|
||||||
|
|
||||||
|
player.replaceMailByIndex(messageIndex, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
proto.addAllMailIdList(claimedMessages.stream().map(Mail::getId).collect(Collectors.toList()));
|
proto.addAllMailIdList(claimedMessages.stream().map(Mail::getId).collect(Collectors.toList()));
|
||||||
proto.addAllItemList(claimedItems);
|
proto.addAllItemList(claimedItems);
|
||||||
player.save();
|
|
||||||
|
|
||||||
Grasscutter.getLogger().info(Grasscutter.getDispatchServer().getGsonFactory().toJson(proto.build()));
|
|
||||||
this.setData(proto.build());
|
this.setData(proto.build());
|
||||||
player.getSession().send(new PacketMailChangeNotify(player, claimedMessages));
|
player.getSession().send(new PacketMailChangeNotify(player, claimedMessages)); // For some reason you have to also send the MailChangeNotify packet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,44 +18,52 @@ public class PacketMailChangeNotify extends GenshinPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public PacketMailChangeNotify(GenshinPlayer player, List<Mail> mailList) {
|
public PacketMailChangeNotify(GenshinPlayer player, List<Mail> mailList) {
|
||||||
|
this(player, mailList, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketMailChangeNotify(GenshinPlayer player, List<Mail> mailList, List<Integer> delMailIdList) {
|
||||||
super(PacketOpcodes.MailChangeNotify);
|
super(PacketOpcodes.MailChangeNotify);
|
||||||
|
|
||||||
MailChangeNotifyOuterClass.MailChangeNotify.Builder proto = MailChangeNotifyOuterClass.MailChangeNotify.newBuilder();
|
MailChangeNotifyOuterClass.MailChangeNotify.Builder proto = MailChangeNotifyOuterClass.MailChangeNotify.newBuilder();
|
||||||
|
|
||||||
for(Mail message : mailList) {
|
if (mailList != null) {
|
||||||
MailTextContentOuterClass.MailTextContent.Builder mailTextContent = MailTextContentOuterClass.MailTextContent.newBuilder();
|
for (Mail message : mailList) {
|
||||||
mailTextContent.setTitle(message.mailContent.title);
|
MailTextContentOuterClass.MailTextContent.Builder mailTextContent = MailTextContentOuterClass.MailTextContent.newBuilder();
|
||||||
mailTextContent.setContent(message.mailContent.content);
|
mailTextContent.setTitle(message.mailContent.title);
|
||||||
mailTextContent.setSender(message.mailContent.sender);
|
mailTextContent.setContent(message.mailContent.content);
|
||||||
|
mailTextContent.setSender(message.mailContent.sender);
|
||||||
|
|
||||||
List<MailItemOuterClass.MailItem> mailItems = new ArrayList<MailItemOuterClass.MailItem>();
|
List<MailItemOuterClass.MailItem> mailItems = new ArrayList<MailItemOuterClass.MailItem>();
|
||||||
|
|
||||||
for(Mail.MailItem item : message.itemList) {
|
for (Mail.MailItem item : message.itemList) {
|
||||||
MailItemOuterClass.MailItem.Builder mailItem = MailItemOuterClass.MailItem.newBuilder();
|
MailItemOuterClass.MailItem.Builder mailItem = MailItemOuterClass.MailItem.newBuilder();
|
||||||
ItemParamOuterClass.ItemParam.Builder itemParam = ItemParamOuterClass.ItemParam.newBuilder();
|
ItemParamOuterClass.ItemParam.Builder itemParam = ItemParamOuterClass.ItemParam.newBuilder();
|
||||||
itemParam.setItemId(item.itemId);
|
itemParam.setItemId(item.itemId);
|
||||||
itemParam.setCount(item.itemCount);
|
itemParam.setCount(item.itemCount);
|
||||||
mailItem.setItemParam(itemParam.build());
|
mailItem.setItemParam(itemParam.build());
|
||||||
|
|
||||||
mailItems.add(mailItem.build());
|
mailItems.add(mailItem.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
MailDataOuterClass.MailData.Builder mailData = MailDataOuterClass.MailData.newBuilder();
|
||||||
|
mailData.setMailId(message._id);
|
||||||
|
mailData.setMailTextContent(mailTextContent.build());
|
||||||
|
mailData.addAllItemList(mailItems);
|
||||||
|
mailData.setSendTime((int) message.sendTime);
|
||||||
|
mailData.setExpireTime((int) message.expireTime);
|
||||||
|
mailData.setImportance(message.importance);
|
||||||
|
mailData.setIsRead(message.isRead);
|
||||||
|
mailData.setIsAttachmentGot(message.isAttachmentGot);
|
||||||
|
mailData.setStateValue(message.stateValue);
|
||||||
|
|
||||||
|
proto.addMailList(mailData.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
MailDataOuterClass.MailData.Builder mailData = MailDataOuterClass.MailData.newBuilder();
|
|
||||||
mailData.setMailId(message._id);
|
|
||||||
mailData.setMailTextContent(mailTextContent.build());
|
|
||||||
mailData.addAllItemList(mailItems);
|
|
||||||
mailData.setSendTime((int)message.sendTime);
|
|
||||||
mailData.setExpireTime((int)message.expireTime);
|
|
||||||
mailData.setImportance(message.importance);
|
|
||||||
mailData.setIsRead(message.isRead);
|
|
||||||
mailData.setIsAttachmentGot(message.isAttachmentGot);
|
|
||||||
mailData.setStateValue(message.stateValue);
|
|
||||||
|
|
||||||
proto.addMailList(mailData.build());
|
|
||||||
|
|
||||||
Grasscutter.getLogger().info(Grasscutter.getDispatchServer().getGsonFactory().toJson(proto.build()));
|
|
||||||
|
|
||||||
this.setData(proto.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(delMailIdList != null) {
|
||||||
|
proto.addAllDelMailIdList(delMailIdList);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setData(proto.build());
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user