Commit 7f3e8984 authored by zhaodice's avatar zhaodice Committed by GitHub
Browse files

Fix receiving reward repeatedly (#1140)

* Fix receiving reward repeatedly

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

* Fix dead code and prevent getting item repeatedly

* fix again
parent d10fe0cd
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 {
Player pl = session.getPlayer();
synchronized (pl) {
TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload); TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload);
int level = req.getLevel(); int level = req.getLevel();
Set<Integer> rewardedLevels = session.getPlayer().getRewardedLevels();
if (!rewardedLevels.contains(level)) {// No duplicated reward
int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId(); int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId();
if (rewardId != 0) { if (rewardId != 0) {
List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList(); List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
session.getPlayer().getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward); pl.getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward);
Set<Integer> rewardedLevels = session.getPlayer().getRewardedLevels();
rewardedLevels.add(level); rewardedLevels.add(level);
session.getPlayer().setRewardedLevels(rewardedLevels); pl.setRewardedLevels(rewardedLevels);
} pl.save();
session.send(new PacketTakePlayerLevelRewardRsp(level, rewardId)); session.send(new PacketTakePlayerLevelRewardRsp(level, rewardId));
} }
}
}
}
} }
...@@ -18,30 +18,32 @@ public class PacketGetMailItemRsp extends BasePacket { ...@@ -18,30 +18,32 @@ 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();
synchronized (player) {
boolean modified = false;
for (int mailId : mailList) { for (int mailId : mailList) {
Mail message = player.getMail(mailId); Mail message = player.getMail(mailId);
if (!message.isAttachmentGot) {//No duplicated item
for(Mail.MailItem mailItem : message.itemList) { for (Mail.MailItem mailItem : message.itemList) {
EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder(); EquipParamOuterClass.EquipParam.Builder item = EquipParamOuterClass.EquipParam.newBuilder();
int promoteLevel = 0; int promoteLevel = 0;
if (mailItem.itemLevel > 20) { // 20/40
promoteLevel = 1; if (mailItem.itemLevel > 80) { // 80/90
} else if (mailItem.itemLevel > 40) { // 40/50 promoteLevel = 6;
promoteLevel = 2;
} else if (mailItem.itemLevel > 50) { // 50/60
promoteLevel = 3;
} else if (mailItem.itemLevel > 60) { // 60/70
promoteLevel = 4;
} else if (mailItem.itemLevel > 70) { // 70/80 } else if (mailItem.itemLevel > 70) { // 70/80
promoteLevel = 5; promoteLevel = 5;
} else if (mailItem.itemLevel > 80) { // 80/90 } else if (mailItem.itemLevel > 60) { // 60/70
promoteLevel = 6; promoteLevel = 4;
} else if (mailItem.itemLevel > 50) { // 50/60
promoteLevel = 3;
} else if (mailItem.itemLevel > 40) { // 40/50
promoteLevel = 2;
} else if (mailItem.itemLevel > 20) { // 20/40
promoteLevel = 1;
} }
item.setItemId(mailItem.itemId); item.setItemId(mailItem.itemId);
...@@ -61,9 +63,15 @@ public class PacketGetMailItemRsp extends BasePacket { ...@@ -61,9 +63,15 @@ public class PacketGetMailItemRsp extends BasePacket {
claimedMessages.add(message); claimedMessages.add(message);
player.replaceMailByIndex(mailId, message); player.replaceMailByIndex(mailId, message);
modified = true;
}
}
if(modified) {
player.save();
}
} }
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());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment