Implement mail attachments

This commit is contained in:
Melledy
2023-10-17 22:56:36 -07:00
parent 0bbd30eb17
commit f0c10071d9
7 changed files with 1418 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
package emu.lunarcore.game.mail;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -55,6 +56,13 @@ public class Mail {
}
}
public void addAttachment(GameItem item) {
if (this.attachments == null) {
this.attachments = new ArrayList<>();
}
this.attachments.add(item);
}
// Database
public void save() {
@@ -75,8 +83,16 @@ public class Mail {
.setSender(this.getSender())
.setTime(this.getTime())
.setExpireTime(this.getExpiry())
.setIsRead(this.isRead())
.setAttachment(ItemList.newInstance());
.setIsRead(this.isRead());
// Add attachments
ItemList list = ItemList.newInstance();
if (this.attachments != null) {
this.attachments.stream().map(GameItem::toProto).forEach(list::addItemList);
}
proto.setAttachment(list);
return proto;
}

View File

@@ -1,9 +1,12 @@
package emu.lunarcore.game.mail;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;
import emu.lunarcore.LunarRail;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.player.BasePlayerManager;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.server.packet.send.PacketNewMailScNotify;
@@ -56,6 +59,28 @@ public class Mailbox extends BasePlayerManager implements Iterable<Mail> {
// Send packet
this.getPlayer().sendPacket(new PacketNewMailScNotify(mail));
}
public synchronized List<GameItem> takeMailAttachments(RepeatedInt idList) {
List<GameItem> attachments = new ArrayList<>();
for (int id : idList) {
Mail mail = getMap().get(id);
if (mail == null || mail.isRead() || mail.getAttachments() == null) {
continue;
}
// Add attachments to inventory
for (GameItem item : mail.getAttachments()) {
getPlayer().getInventory().addItem(item);
attachments.add(item);
}
// Set read
mail.setRead();
}
return attachments;
}
public synchronized IntList deleteMail(RepeatedInt idList) {
IntList deleteList = new IntArrayList();
@@ -91,4 +116,5 @@ public class Mailbox extends BasePlayerManager implements Iterable<Mail> {
stream.forEach(this::putMail);
}
}

View File

@@ -0,0 +1,25 @@
package emu.lunarcore.server.packet.recv;
import java.util.List;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.TakeMailAttachmentCsReqOuterClass.TakeMailAttachmentCsReq;
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.PacketTakeMailAttachmentScRsp;
@Opcodes(CmdId.TakeMailAttachmentCsReq)
public class HandlerTakeMailAttachmentCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = TakeMailAttachmentCsReq.parseFrom(data);
List<GameItem> attachments = session.getPlayer().getMailbox().takeMailAttachments(req.getMailIdList());
session.send(new PacketTakeMailAttachmentScRsp(req.getMailIdList(), attachments));
}
}

View File

@@ -0,0 +1,28 @@
package emu.lunarcore.server.packet.send;
import java.util.Collection;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.TakeMailAttachmentScRspOuterClass.TakeMailAttachmentScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import us.hebi.quickbuf.RepeatedInt;
public class PacketTakeMailAttachmentScRsp extends BasePacket {
public PacketTakeMailAttachmentScRsp(RepeatedInt idList, Collection<GameItem> items) {
super(CmdId.TakeMailAttachmentScRsp);
var data = TakeMailAttachmentScRsp.newInstance();
for (int id : idList) {
data.addSuccMailIdList(id);
}
for (GameItem item : items) {
data.getMutableAttachment().addItemList(item.toProto());
}
this.setData(data);
}
}