Fix receiving reward repeatedly (#1140)

* Fix receiving reward repeatedly

fix #1105 (just fix "无限发送领取请求")

* Fix dead code and prevent getting item repeatedly

* fix again
This commit is contained in:
zhaodice 2022-06-02 07:13:48 +08:00 committed by GitHub
parent d10fe0cdd3
commit 7f3e8984ac
2 changed files with 60 additions and 52 deletions

View File

@ -1,40 +1,40 @@
package emu.grasscutter.server.packet.recv; package emu.grasscutter.server.packet.recv;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData; import emu.grasscutter.data.GameData;
import emu.grasscutter.data.common.ItemParamData; import emu.grasscutter.data.common.ItemParamData;
import emu.grasscutter.game.inventory.GameItem; import emu.grasscutter.game.player.Player;
import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.props.ActionReason;
import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.TakePlayerLevelRewardReqOuterClass.TakePlayerLevelRewardReq; import emu.grasscutter.net.proto.TakePlayerLevelRewardReqOuterClass.TakePlayerLevelRewardReq;
import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
import emu.grasscutter.server.packet.send.PacketTakePlayerLevelRewardRsp; import emu.grasscutter.server.packet.send.PacketTakePlayerLevelRewardRsp;
@Opcodes(PacketOpcodes.TakePlayerLevelRewardReq) @Opcodes(PacketOpcodes.TakePlayerLevelRewardReq)
public class HandlerTakePlayerLevelRewardReq extends PacketHandler { public class HandlerTakePlayerLevelRewardReq extends PacketHandler {
@Override @Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload); Player pl = session.getPlayer();
synchronized (pl) {
int level = req.getLevel(); TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload);
int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId(); int level = req.getLevel();
if (rewardId != 0) {
List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
session.getPlayer().getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward);
Set<Integer> rewardedLevels = session.getPlayer().getRewardedLevels(); Set<Integer> rewardedLevels = session.getPlayer().getRewardedLevels();
rewardedLevels.add(level); if (!rewardedLevels.contains(level)) {// No duplicated reward
session.getPlayer().setRewardedLevels(rewardedLevels); int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId();
if (rewardId != 0) {
List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
pl.getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward);
rewardedLevels.add(level);
pl.setRewardedLevels(rewardedLevels);
pl.save();
session.send(new PacketTakePlayerLevelRewardRsp(level, rewardId));
}
}
} }
session.send(new PacketTakePlayerLevelRewardRsp(level, rewardId));
} }
} }

View File

@ -18,52 +18,60 @@ public class PacketGetMailItemRsp extends BasePacket {
public PacketGetMailItemRsp(Player player, List<Integer> mailList) { public PacketGetMailItemRsp(Player player, List<Integer> mailList) {
super(PacketOpcodes.GetMailItemRsp); super(PacketOpcodes.GetMailItemRsp);
List<Mail> claimedMessages = new ArrayList<>(); List<Mail> claimedMessages = new ArrayList<>();
List<EquipParamOuterClass.EquipParam> claimedItems = new ArrayList<>(); List<EquipParamOuterClass.EquipParam> claimedItems = new ArrayList<>();
GetMailItemRsp.Builder proto = GetMailItemRsp.newBuilder(); GetMailItemRsp.Builder proto = GetMailItemRsp.newBuilder();
for (int mailId : mailList) { synchronized (player) {
Mail message = player.getMail(mailId); boolean modified = false;
for (int mailId : mailList) {
Mail message = player.getMail(mailId);
if (!message.isAttachmentGot) {//No duplicated item
for (Mail.MailItem mailItem : message.itemList) {
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder();
int promoteLevel = 0;
for(Mail.MailItem mailItem : message.itemList) { if (mailItem.itemLevel > 80) { // 80/90
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder(); promoteLevel = 6;
int promoteLevel = 0; } else if (mailItem.itemLevel > 70) { // 70/80
if (mailItem.itemLevel > 20) { // 20/40 promoteLevel = 5;
promoteLevel = 1; } else if (mailItem.itemLevel > 60) { // 60/70
} else if (mailItem.itemLevel > 40) { // 40/50 promoteLevel = 4;
promoteLevel = 2; } else if (mailItem.itemLevel > 50) { // 50/60
} else if (mailItem.itemLevel > 50) { // 50/60 promoteLevel = 3;
promoteLevel = 3; } else if (mailItem.itemLevel > 40) { // 40/50
} else if (mailItem.itemLevel > 60) { // 60/70 promoteLevel = 2;
promoteLevel = 4; } else if (mailItem.itemLevel > 20) { // 20/40
} else if (mailItem.itemLevel > 70) { // 70/80 promoteLevel = 1;
promoteLevel = 5; }
} else if (mailItem.itemLevel > 80) { // 80/90
promoteLevel = 6; item.setItemId(mailItem.itemId);
item.setItemNum(mailItem.itemCount);
item.setItemLevel(mailItem.itemLevel);
item.setPromoteLevel(promoteLevel);
claimedItems.add(item.build());
GameItem gameItem = new GameItem(GameData.getItemDataMap().get(mailItem.itemId));
gameItem.setCount(mailItem.itemCount);
gameItem.setLevel(mailItem.itemLevel);
gameItem.setPromoteLevel(promoteLevel);
player.getInventory().addItem(gameItem, ActionReason.MailAttachment);
}
message.isAttachmentGot = true;
claimedMessages.add(message);
player.replaceMailByIndex(mailId, message);
modified = true;
} }
item.setItemId(mailItem.itemId);
item.setItemNum(mailItem.itemCount);
item.setItemLevel(mailItem.itemLevel);
item.setPromoteLevel(promoteLevel);
claimedItems.add(item.build());
GameItem gameItem = new GameItem(GameData.getItemDataMap().get(mailItem.itemId));
gameItem.setCount(mailItem.itemCount);
gameItem.setLevel(mailItem.itemLevel);
gameItem.setPromoteLevel(promoteLevel);
player.getInventory().addItem(gameItem, ActionReason.MailAttachment);
} }
if(modified) {
message.isAttachmentGot = true; player.save();
claimedMessages.add(message); }
player.replaceMailByIndex(mailId, message);
} }
proto.addAllMailIdList(claimedMessages.stream().map(message -> player.getMailId(message)).collect(Collectors.toList())); proto.addAllMailIdList(claimedMessages.stream().map(player::getMailId).collect(Collectors.toList()));
proto.addAllItemList(claimedItems); proto.addAllItemList(claimedItems);
this.setData(proto.build()); this.setData(proto.build());