想看看怎么修复
学习一下
6666666666666666
123336666666666666666
修复未开启宠物的情况下使用宠物食品的物品BUG
这个BUG会导致物品栏甚至角色锁定,修复办法:
这个端的BUG有点多哦
AI说你这段无法解决问题 还是有可能卡死他给了个自认为完美的版本
MaplePet pet = c.getPlayer().getPet(slot);
slea.readInt();
slea.readShort();
int itemId = slea.readInt();
// 安全校验:宠物不存在或食物ID无效时直接中断,避免后续空指针
if (pet == null || itemId <= 0) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
boolean gainCloseness = Randomizer.nextInt(101) > 50;
// 常量,方便你调整数值
final int FULLNESS_MAX = 100;
final int FULLNESS_INCREASE = 30;
final int CLOSENESS_MAX = 30000;
if (pet.getFullness() < FULLNESS_MAX) {
// === 喂养成功 ===
pet.setFullness(Math.min(pet.getFullness() + FULLNESS_INCREASE, FULLNESS_MAX));
if (gainCloseness && pet.getCloseness() < CLOSENESS_MAX) {
int newCloseness = Math.min(pet.getCloseness() + 1, CLOSENESS_MAX);
pet.setCloseness(newCloseness);
if (newCloseness >= ExpTable.getClosenessNeededForLevel(pet.getLevel() + 1)) {
pet.setLevel(pet.getLevel() + 1);
}
}
// 总是发送更新包
c.getSession().write(PetPacket.updatePet(pet, c.getPlayer().getInventory(MapleInventoryType.CASH).getItem((byte) pet.getInventoryPosition()), true));
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PetPacket.commandResponse(c.getPlayer().getId(), slot, 1, true), true);
} else {
// === 宠物已饱,喂养失败 ===
if (gainCloseness) {
int newCloseness = Math.max(pet.getCloseness() - 1, 0);
pet.setCloseness(newCloseness);
if (newCloseness < ExpTable.getClosenessNeededForLevel(pet.getLevel())) {
pet.setLevel(pet.getLevel() - 1);
}
// 修复锁定的关键:必须发送更新包!
c.getSession().write(PetPacket.updatePet(pet, c.getPlayer().getInventory(MapleInventoryType.CASH).getItem((byte) pet.getInventoryPosition()), true));
}
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PetPacket.commandResponse(c.getPlayer().getId(), slot, 1, false), true);
}
// 扣除食物(无论成功失败)
MapleInventoryManipulator.removeById(c, MapleInventoryType.USE, itemId, 1, true, false);