diff --git a/src/main/java/emu/grasscutter/game/dungeons/DungeonChallenge.java b/src/main/java/emu/grasscutter/game/dungeons/DungeonChallenge.java index 66d02221a..1b595723a 100644 --- a/src/main/java/emu/grasscutter/game/dungeons/DungeonChallenge.java +++ b/src/main/java/emu/grasscutter/game/dungeons/DungeonChallenge.java @@ -9,6 +9,7 @@ import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.world.Scene; import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType; +import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneMonster; import emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify; @@ -73,9 +74,9 @@ public class DungeonChallenge { getScene().broadcastPacket(new PacketDungeonChallengeFinishNotify(this)); if (this.isSuccess()) { - this.getScene().getScriptManager().onChallengeSuccess(); + this.getScene().getScriptManager().callEvent(EventType.EVENT_CHALLENGE_SUCCESS, null); } else { - this.getScene().getScriptManager().onChallengeFailure(); + this.getScene().getScriptManager().callEvent(EventType.EVENT_CHALLENGE_FAIL, null); } } diff --git a/src/main/java/emu/grasscutter/game/world/Scene.java b/src/main/java/emu/grasscutter/game/world/Scene.java index 44c5be1d2..93bfab9db 100644 --- a/src/main/java/emu/grasscutter/game/world/Scene.java +++ b/src/main/java/emu/grasscutter/game/world/Scene.java @@ -20,9 +20,11 @@ import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult; import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType; import emu.grasscutter.scripts.SceneScriptManager; +import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.data.SceneBlock; import emu.grasscutter.scripts.data.SceneGadget; import emu.grasscutter.scripts.data.SceneGroup; +import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify; import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify; @@ -505,7 +507,7 @@ public class Scene { entity.setState(g.state); this.addEntity(entity); - this.getScriptManager().onGadgetCreate(entity); + this.getScriptManager().callEvent(EventType.EVENT_GADGET_CREATE, new ScriptArgs(entity.getConfigId())); } } } diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index c5de4807f..09104f63d 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -18,7 +18,7 @@ import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.world.Scene; -import emu.grasscutter.scripts.constants.ScriptEventType; +import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.constants.ScriptGadgetState; import emu.grasscutter.scripts.constants.ScriptRegionShape; import emu.grasscutter.scripts.data.SceneBlock; @@ -29,6 +29,7 @@ import emu.grasscutter.scripts.data.SceneInitConfig; import emu.grasscutter.scripts.data.SceneMonster; import emu.grasscutter.scripts.data.SceneSuite; import emu.grasscutter.scripts.data.SceneTrigger; +import emu.grasscutter.scripts.data.ScriptArgs; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -120,7 +121,7 @@ public class SceneScriptManager { bindings = ScriptLoader.getEngine().createBindings(); // Set variables - bindings.put("EventType", new ScriptEventType()); // TODO - make static class to avoid instantiating a new class every scene + bindings.put("EventType", new EventType()); // TODO - make static class to avoid instantiating a new class every scene bindings.put("GadgetState", new ScriptGadgetState()); bindings.put("RegionShape", new ScriptRegionShape()); bindings.put("ScriptLib", getScriptLib()); @@ -208,76 +209,30 @@ public class SceneScriptManager { // Events - private LuaValue getFunc(String name) { - return (LuaValue) this.getBindings().get(name); - } - - public void onGadgetCreate(EntityGadget gadget) { - LuaTable params = new LuaTable(); - params.set("param1", gadget.getConfigId()); - - for (SceneTrigger trigger : this.getTriggersByEvent(ScriptEventType.EVENT_GADGET_CREATE)) { - LuaValue condition = getFunc(trigger.condition); - - LuaValue ret = condition.call(this.getScriptLibLua(), params); + public void callEvent(int eventType, ScriptArgs params) { + for (SceneTrigger trigger : this.getTriggersByEvent(eventType)) { + LuaValue condition = null; + + if (trigger.condition != null && !trigger.condition.isEmpty()) { + condition = (LuaValue) this.getBindings().get(trigger.condition); + } + + LuaValue ret = LuaValue.TRUE; + + if (condition != null) { + LuaValue args = LuaValue.NIL; + + if (params != null) { + args = CoerceJavaToLua.coerce(params); + } + + ret = condition.call(this.getScriptLibLua(), args); + } if (ret.checkboolean() == true) { - LuaValue action = getFunc(trigger.action); + LuaValue action = (LuaValue) this.getBindings().get(trigger.action); action.call(this.getScriptLibLua(), LuaValue.NIL); } } } - - public void onOptionSelect(int entityId, int optionId) { - GameEntity entity = this.getScene().getEntityById(entityId); - - if (entity == null || !(entity instanceof EntityGadget)) { - return; - } - - LuaTable params = new LuaTable(); - params.set("param1", entity.getConfigId()); - params.set("param2", optionId); - - for (SceneTrigger trigger : this.getTriggersByEvent(ScriptEventType.EVENT_SELECT_OPTION)) { - LuaValue condition = getFunc(trigger.condition); - - LuaValue ret = condition.call(this.getScriptLibLua(), params); - - if (ret.checkboolean() == true) { - LuaValue action = getFunc(trigger.action); - action.call(this.getScriptLibLua(), LuaValue.NIL); - } - } - } - - public void onMonsterSpawn(EntityMonster entity) { - LuaTable params = new LuaTable(); - params.set("param1", entity.getConfigId()); - - for (SceneTrigger trigger : this.getTriggersByEvent(ScriptEventType.EVENT_ANY_MONSTER_LIVE)) { - LuaValue condition = getFunc(trigger.condition); - - LuaValue ret = condition.call(this.getScriptLibLua(), params); - - if (ret.checkboolean() == true) { - LuaValue action = getFunc(trigger.action); - action.call(this.getScriptLibLua(), LuaValue.NIL); - } - } - } - - public void onChallengeSuccess() { - for (SceneTrigger trigger : this.getTriggersByEvent(ScriptEventType.EVENT_CHALLENGE_SUCCESS)) { - LuaValue action = getFunc(trigger.action); - action.call(this.getScriptLibLua(), LuaValue.NIL); - } - } - - public void onChallengeFailure() { - for (SceneTrigger trigger : this.getTriggersByEvent(ScriptEventType.EVENT_CHALLENGE_FAIL)) { - LuaValue action = getFunc(trigger.action); - action.call(this.getScriptLibLua(), LuaValue.NIL); - } - } } diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index e44367e6b..87881db51 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -13,8 +13,10 @@ import emu.grasscutter.game.dungeons.DungeonChallenge; import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.GameEntity; +import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneMonster; +import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.server.packet.send.PacketGadgetStateNotify; import emu.grasscutter.server.packet.send.PacketWorktopOptionNotify; @@ -130,7 +132,7 @@ public class ScriptLib { getSceneScriptManager().getScene().addEntities(toAdd); for (GameEntity entity : toAdd) { - this.getSceneScriptManager().onMonsterSpawn((EntityMonster) entity); + this.getSceneScriptManager().callEvent(EventType.EVENT_ANY_MONSTER_LIVE, new ScriptArgs(entity.getConfigId())); } } diff --git a/src/main/java/emu/grasscutter/scripts/constants/ScriptEventType.java b/src/main/java/emu/grasscutter/scripts/constants/EventType.java similarity index 99% rename from src/main/java/emu/grasscutter/scripts/constants/ScriptEventType.java rename to src/main/java/emu/grasscutter/scripts/constants/EventType.java index 1ec2b4bf0..58d8dc3ab 100644 --- a/src/main/java/emu/grasscutter/scripts/constants/ScriptEventType.java +++ b/src/main/java/emu/grasscutter/scripts/constants/EventType.java @@ -1,6 +1,6 @@ package emu.grasscutter.scripts.constants; -public class ScriptEventType { +public class EventType { public static final int EVENT_NONE = 0; public static final int EVENT_ANY_MONSTER_DIE = 1; public static final int EVENT_ANY_GADGET_DIE = 2; diff --git a/src/main/java/emu/grasscutter/scripts/data/ScriptArgs.java b/src/main/java/emu/grasscutter/scripts/data/ScriptArgs.java new file mode 100644 index 000000000..3073f7322 --- /dev/null +++ b/src/main/java/emu/grasscutter/scripts/data/ScriptArgs.java @@ -0,0 +1,47 @@ +package emu.grasscutter.scripts.data; + +public class ScriptArgs { + public int param1; + public int param2; + public int param3; + + public ScriptArgs() { + + } + + public ScriptArgs(int param1) { + this.param1 = param1; + } + + public ScriptArgs(int param1, int param2) { + this.param1 = param1; + this.param2 = param2; + } + + public int getParam1() { + return param1; + } + + public ScriptArgs setParam1(int param1) { + this.param1 = param1; + return this; + } + + public int getParam2() { + return param2; + } + + public ScriptArgs setParam2(int param2) { + this.param2 = param2; + return this; + } + + public int getParam3() { + return param3; + } + + public ScriptArgs setParam3(int param3) { + this.param3 = param3; + return this; + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSelectWorktopOptionReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSelectWorktopOptionReq.java index 23f3af4cc..82980c452 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSelectWorktopOptionReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSelectWorktopOptionReq.java @@ -1,8 +1,12 @@ package emu.grasscutter.server.packet.recv; +import emu.grasscutter.game.entity.EntityGadget; +import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass.SelectWorktopOptionReq; +import emu.grasscutter.scripts.constants.EventType; +import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.packet.send.PacketSelectWorktopOptionRsp; @@ -14,9 +18,21 @@ public class HandlerSelectWorktopOptionReq extends PacketHandler { public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { SelectWorktopOptionReq req = SelectWorktopOptionReq.parseFrom(payload); - session.getPlayer().getScene().getScriptManager().onOptionSelect(req.getGadgetEntityId(), req.getOptionId()); - - session.send(new PacketSelectWorktopOptionRsp(req.getGadgetEntityId(), req.getOptionId())); + try { + GameEntity entity = session.getPlayer().getScene().getEntityById(req.getGadgetEntityId()); + + if (entity == null || !(entity instanceof EntityGadget)) { + return; + } + + session.getPlayer().getScene().getScriptManager().callEvent( + EventType.EVENT_SELECT_OPTION, + new ScriptArgs(entity.getConfigId(), req.getOptionId()) + ); + } finally { + // Always send packet + session.send(new PacketSelectWorktopOptionRsp(req.getGadgetEntityId(), req.getOptionId())); + } } }