mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-26 13:11:09 +00: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:
parent
d10fe0cdd3
commit
7f3e8984ac
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
Loading…
Reference in New Issue
Block a user