diff --git a/src/main/java/emu/grasscutter/game/entity/GameEntity.java b/src/main/java/emu/grasscutter/game/entity/GameEntity.java index 3ec77618de0..c1c195a6373 100644 --- a/src/main/java/emu/grasscutter/game/entity/GameEntity.java +++ b/src/main/java/emu/grasscutter/game/entity/GameEntity.java @@ -52,8 +52,8 @@ public GameEntity(Scene scene) { public abstract void initAbilities(); - public int getEntityType() { - return this.getId() >> 24; + public EntityType getEntityType() { + return EntityIdType.toEntityType(this.getId() >> 24); } public abstract int getEntityTypeId(); diff --git a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java index 0244d652d05..87451dad766 100644 --- a/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java +++ b/src/main/java/emu/grasscutter/game/entity/gadget/GadgetGatherObject.java @@ -14,6 +14,8 @@ import emu.grasscutter.net.proto.GatherGadgetInfoOuterClass.GatherGadgetInfo; import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType; import emu.grasscutter.net.proto.SceneGadgetInfoOuterClass.SceneGadgetInfo; +import emu.grasscutter.scripts.constants.EventType; +import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp; import emu.grasscutter.utils.Utils; @@ -57,6 +59,12 @@ public boolean onInteract(Player player, GadgetInteractReq req) { GameItem item = new GameItem(itemData, 1); player.getInventory().addItem(item, ActionReason.Gather); + getGadget() + .getScene() + .getScriptManager() + .callEvent( + new ScriptArgs(getGadget().getGroupId(), EventType.EVENT_GATHER, getGadget().getConfigId())); + getGadget() .getScene() .broadcastPacket( diff --git a/src/main/java/emu/grasscutter/game/props/EntityIdType.java b/src/main/java/emu/grasscutter/game/props/EntityIdType.java index 7d546dbb9df..f9acd0f616d 100644 --- a/src/main/java/emu/grasscutter/game/props/EntityIdType.java +++ b/src/main/java/emu/grasscutter/game/props/EntityIdType.java @@ -1,5 +1,8 @@ package emu.grasscutter.game.props; +import java.util.HashMap; +import java.util.Map; + public enum EntityIdType { AVATAR(0x01), MONSTER(0x02), @@ -12,10 +15,27 @@ public enum EntityIdType { private final int id; + private static final Map map = new HashMap<>(); + + static { + map.put(EntityIdType.AVATAR.getId(),EntityType.Avatar); + map.put(EntityIdType.MONSTER.getId(),EntityType.Monster); + map.put(EntityIdType.NPC.getId(),EntityType.NPC); + map.put(EntityIdType.GADGET.getId(),EntityType.Gadget); + map.put(EntityIdType.REGION.getId(),EntityType.Region); + map.put(EntityIdType.WEAPON.getId(),EntityType.Equip); + map.put(EntityIdType.TEAM.getId(),EntityType.Team); + map.put(EntityIdType.MPLEVEL.getId(),EntityType.MPLevel); + } + EntityIdType(int id) { this.id = id; } + public static EntityType toEntityType(int entityId) { + return map.getOrDefault(entityId, EntityType.None); + } + public int getId() { return id; } diff --git a/src/main/java/emu/grasscutter/game/props/EntityType.java b/src/main/java/emu/grasscutter/game/props/EntityType.java index cf06ebae5ce..63e4240cfa8 100644 --- a/src/main/java/emu/grasscutter/game/props/EntityType.java +++ b/src/main/java/emu/grasscutter/game/props/EntityType.java @@ -75,6 +75,7 @@ public enum EntityType implements IntValueEnum { Screen(64), EchoShell(65), UIInteractGadget(66), + Region(98), PlaceHolder(99); private static final Int2ObjectMap map = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index 6f46aaae0ca..9b21f0e6688 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -629,7 +629,7 @@ public void checkRegions() { getScene().getEntities().values().stream() .filter( e -> - e.getEntityType() == EntityType.Avatar.getValue() + e.getEntityType() == EntityType.Avatar && region.getMetaRegion().contains(e.getPosition())) .toList(); entities.forEach(region::addEntity); diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index 871ad828cdd..790406aa589 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -18,6 +18,7 @@ import emu.grasscutter.game.quest.enums.QuestState; import emu.grasscutter.game.world.SceneGroupInstance; import emu.grasscutter.net.proto.EnterTypeOuterClass; +import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType; import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.constants.GroupKillPolicy; import emu.grasscutter.scripts.data.SceneGroup; @@ -610,6 +611,11 @@ public int CreateGadget(LuaTable table){ logger.debug("[LUA] Call CreateGadget with {}", printTable(table)); var configId = table.get("config_id").toint(); + //TODO: figure out what creating gadget configId 0 does + if (configId == 0){ + Grasscutter.getLogger().warn("Tried to CreateGadget with config_id 0: {}", printTable(table)); + return 0; + } var group = getCurrentGroup(); @@ -704,7 +710,7 @@ public int GetEntityType(int entityId){ return EntityType.None.getValue(); } - return entity.getEntityType(); + return entity.getEntityType().getValue(); } public int GetQuestState(int entityId, int questId){ @@ -739,11 +745,11 @@ public int RemoveEntityByConfigId(int groupId, int entityType, int configId){ val entity = getSceneScriptManager().getScene().getEntityByConfigId(configId, groupId); - if(entity == null || entity.getEntityType() != entityType){ + if(entity == null || entity.getEntityType().getValue() != entityType){ return 1; } - getSceneScriptManager().getScene().removeEntity(entity); + getSceneScriptManager().getScene().removeEntity(entity, VisionType.VISION_TYPE_REMOVE); return 0; } @@ -819,7 +825,7 @@ public int GetChannellerSlabLoopDungeonLimitTime(){ } public int IsPlayerAllAvatarDie(int sceneUid){ logger.warn("[LUA] Call unimplemented IsPlayerAllAvatarDie {}", sceneUid); - var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityIdType.AVATAR.getId()).toList(); + var playerEntities = getSceneScriptManager().getScene().getEntities().values().stream().filter(e -> e.getEntityType() == EntityType.Avatar).toList(); for (GameEntity p : playerEntities){ var player = (EntityAvatar)p; if(player.isAlive()){