Grasscutter/src/main/java/emu/grasscutter/server/packet/recv/HandlerQuickUseWidgetReq.java
zhaodice ecf7a81ad1 Fix unable to save game data occasionally (#1194)
* Fix unable to save game data occasionally

* No self-kicking

* Game data synchronization

* finally

* prevent duplicated saving

* reverse changing

* keep the previous code

* Update GameServerInitializer.java

* Update GameSession.java

* remove sanity check because of try block

* a session needs can be created without a pipeline.
2022-06-05 04:23:19 -07:00

55 lines
2.3 KiB
Java

package emu.grasscutter.server.packet.recv;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.inventory.GameItem;
import emu.grasscutter.game.inventory.Inventory;
import emu.grasscutter.game.inventory.InventoryTab;
import emu.grasscutter.game.inventory.ItemType;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.QuickUseWidgetRspOuterClass.QuickUseWidgetRsp;
import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketPullRecentChatRsp;
@Opcodes(PacketOpcodes.QuickUseWidgetReq)
public class HandlerQuickUseWidgetReq extends PacketHandler {
/*
* WARNING: with the consuming of material widget ( Example: bomb ),
* this is just a implement designed to the decreasing of count
*
* ### Known Bug: No effects after using item but decrease. ###
*
* If you know which Packet could make the effects, feel free to contribute!
* */
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
QuickUseWidgetRsp.Builder proto = QuickUseWidgetRsp.newBuilder();
Player pl = session.getPlayer();
synchronized (pl) {
int materialId = pl.getWidgetId();
Inventory inventory = session.getPlayer().getInventory();
InventoryTab inventoryTab = inventory.getInventoryTab(ItemType.ITEM_MATERIAL);
GameItem item = inventoryTab.getItemById(materialId);
int remain = item.getCount();
if (remain > 0) {
remain--;
if (remain <= 0) {
proto.setRetcode(1);
} else {
proto.setRetcode(0);
}
proto.setMaterialId(materialId);
inventory.removeItem(item,1);// decrease count
BasePacket rsp = new BasePacket(PacketOpcodes.QuickUseWidgetRsp);
rsp.setData(proto);
session.send(rsp);
Grasscutter.getLogger().warn("class has no effects in the game, feel free to implement it");
// but no effects in the game, feel free to implement it!
}
}
}
}