mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-12-22 03:45:10 +01:00
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:
@@ -1,40 +1,40 @@
|
||||
package emu.grasscutter.server.packet.recv;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import emu.grasscutter.Grasscutter;
|
||||
import emu.grasscutter.data.GameData;
|
||||
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.net.packet.Opcodes;
|
||||
import emu.grasscutter.net.packet.PacketHandler;
|
||||
import emu.grasscutter.net.packet.PacketOpcodes;
|
||||
import emu.grasscutter.net.proto.TakePlayerLevelRewardReqOuterClass.TakePlayerLevelRewardReq;
|
||||
import emu.grasscutter.server.game.GameSession;
|
||||
import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
|
||||
import emu.grasscutter.server.packet.send.PacketTakePlayerLevelRewardRsp;
|
||||
|
||||
@Opcodes(PacketOpcodes.TakePlayerLevelRewardReq)
|
||||
public class HandlerTakePlayerLevelRewardReq extends PacketHandler {
|
||||
@Override
|
||||
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
||||
TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload);
|
||||
|
||||
int level = req.getLevel();
|
||||
int rewardId = GameData.getPlayerLevelDataMap().get(level).getRewardId();
|
||||
|
||||
if (rewardId != 0) {
|
||||
List<ItemParamData> rewardItems = GameData.getRewardDataMap().get(rewardId).getRewardItemList();
|
||||
session.getPlayer().getInventory().addItemParamDatas(rewardItems, ActionReason.PlayerUpgradeReward);
|
||||
Player pl = session.getPlayer();
|
||||
synchronized (pl) {
|
||||
TakePlayerLevelRewardReq req = TakePlayerLevelRewardReq.parseFrom(payload);
|
||||
int level = req.getLevel();
|
||||
Set<Integer> rewardedLevels = session.getPlayer().getRewardedLevels();
|
||||
rewardedLevels.add(level);
|
||||
session.getPlayer().setRewardedLevels(rewardedLevels);
|
||||
if (!rewardedLevels.contains(level)) {// No duplicated reward
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user