mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-05-14 21:53:45 +08:00
78 lines
3.4 KiB
Java
78 lines
3.4 KiB
Java
package emu.grasscutter.server.packet.recv;
|
|
|
|
import emu.grasscutter.data.GameData;
|
|
import emu.grasscutter.data.excels.ItemData;
|
|
import emu.grasscutter.data.excels.monster.MonsterData;
|
|
import emu.grasscutter.game.entity.*;
|
|
import emu.grasscutter.game.world.Position;
|
|
import emu.grasscutter.net.packet.*;
|
|
import emu.grasscutter.net.proto.QuestCreateEntityReqOuterClass.QuestCreateEntityReq;
|
|
import emu.grasscutter.scripts.data.SceneGadget;
|
|
import emu.grasscutter.server.game.GameSession;
|
|
import emu.grasscutter.server.packet.send.PacketQuestCreateEntityRsp;
|
|
import lombok.val;
|
|
|
|
@Opcodes(PacketOpcodes.QuestCreateEntityReq)
|
|
public class HandlerQuestCreateEntityReq extends PacketHandler {
|
|
|
|
@Override
|
|
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
|
|
val req = QuestCreateEntityReq.parseFrom(payload);
|
|
val entity = req.getEntity();
|
|
val scene = session.getPlayer().getWorld().getSceneById(entity.getSceneId());
|
|
|
|
val pos = new Position(entity.getPos());
|
|
val rot = new Position(entity.getRot());
|
|
GameEntity gameEntity = null;
|
|
switch (entity.getEntityCase()) {
|
|
case GADGET_ID -> {
|
|
val gadgetId = entity.getGadgetId();
|
|
val gadgetInfo = entity.getGadget();
|
|
var gadgetData = GameData.getGadgetDataMap().get(gadgetId);
|
|
gameEntity =
|
|
switch (gadgetData.getType()) {
|
|
case Vehicle -> new EntityVehicle(scene, session.getPlayer(), gadgetId, 0, pos, rot);
|
|
case Chest -> {
|
|
var chest = gadgetInfo.getChest();
|
|
var gadget = new EntityGadget(scene, gadgetId, pos, rot);
|
|
// Create the gadget data for the chest.
|
|
var metaGadget = new SceneGadget();
|
|
metaGadget.drop_count = 1; // TODO: Check if more items should be dropped.
|
|
metaGadget.chest_drop_id = chest.getChestDropId();
|
|
metaGadget.setShowcutscene(chest.getIsShowCutscene());
|
|
// Apply the gadget data to the chest.
|
|
gadget.setMetaGadget(metaGadget);
|
|
|
|
yield gadget;
|
|
}
|
|
default -> new EntityGadget(scene, gadgetId, pos, rot);
|
|
};
|
|
|
|
if (gameEntity instanceof EntityGadget gadget) {
|
|
gadget.buildContent();
|
|
}
|
|
}
|
|
case ITEM_ID -> {
|
|
val itemId = entity.getItemId();
|
|
ItemData itemData = GameData.getItemDataMap().get(itemId);
|
|
gameEntity = new EntityItem(scene, null, itemData, pos, 1, true);
|
|
}
|
|
case MONSTER_ID -> {
|
|
val monsterId = entity.getMonsterId();
|
|
val level = entity.getLevel();
|
|
MonsterData monsterData = GameData.getMonsterDataMap().get(monsterId);
|
|
gameEntity = new EntityMonster(scene, monsterData, pos, level);
|
|
}
|
|
case NPC_ID -> {}
|
|
}
|
|
|
|
if (gameEntity != null) {
|
|
scene.addEntity(gameEntity);
|
|
}
|
|
|
|
val createdEntityId = gameEntity != null ? gameEntity.getId() : -1;
|
|
|
|
session.send(new PacketQuestCreateEntityRsp(createdEntityId, req));
|
|
}
|
|
}
|