Commit 8ab2b446 authored by Melledy's avatar Melledy
Browse files

Clean script events

parent 30886da0
...@@ -9,6 +9,7 @@ import emu.grasscutter.game.entity.EntityMonster; ...@@ -9,6 +9,7 @@ import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.world.Scene; import emu.grasscutter.game.world.Scene;
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType; import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.SceneMonster; import emu.grasscutter.scripts.data.SceneMonster;
import emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify; import emu.grasscutter.server.packet.send.PacketDungeonChallengeBeginNotify;
...@@ -73,9 +74,9 @@ public class DungeonChallenge { ...@@ -73,9 +74,9 @@ public class DungeonChallenge {
getScene().broadcastPacket(new PacketDungeonChallengeFinishNotify(this)); getScene().broadcastPacket(new PacketDungeonChallengeFinishNotify(this));
if (this.isSuccess()) { if (this.isSuccess()) {
this.getScene().getScriptManager().onChallengeSuccess(); this.getScene().getScriptManager().callEvent(EventType.EVENT_CHALLENGE_SUCCESS, null);
} else { } else {
this.getScene().getScriptManager().onChallengeFailure(); this.getScene().getScriptManager().callEvent(EventType.EVENT_CHALLENGE_FAIL, null);
} }
} }
......
...@@ -20,9 +20,11 @@ import emu.grasscutter.net.packet.BasePacket; ...@@ -20,9 +20,11 @@ import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult; import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType; import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
import emu.grasscutter.scripts.SceneScriptManager; import emu.grasscutter.scripts.SceneScriptManager;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.SceneBlock; import emu.grasscutter.scripts.data.SceneBlock;
import emu.grasscutter.scripts.data.SceneGadget; import emu.grasscutter.scripts.data.SceneGadget;
import emu.grasscutter.scripts.data.SceneGroup; 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.PacketEntityFightPropUpdateNotify;
import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify; import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify;
import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify; import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify;
...@@ -505,7 +507,7 @@ public class Scene { ...@@ -505,7 +507,7 @@ public class Scene {
entity.setState(g.state); entity.setState(g.state);
this.addEntity(entity); this.addEntity(entity);
this.getScriptManager().onGadgetCreate(entity); this.getScriptManager().callEvent(EventType.EVENT_GADGET_CREATE, new ScriptArgs(entity.getConfigId()));
} }
} }
} }
......
...@@ -18,7 +18,7 @@ import emu.grasscutter.game.entity.EntityGadget; ...@@ -18,7 +18,7 @@ import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.game.world.Scene; 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.ScriptGadgetState;
import emu.grasscutter.scripts.constants.ScriptRegionShape; import emu.grasscutter.scripts.constants.ScriptRegionShape;
import emu.grasscutter.scripts.data.SceneBlock; import emu.grasscutter.scripts.data.SceneBlock;
...@@ -29,6 +29,7 @@ import emu.grasscutter.scripts.data.SceneInitConfig; ...@@ -29,6 +29,7 @@ import emu.grasscutter.scripts.data.SceneInitConfig;
import emu.grasscutter.scripts.data.SceneMonster; import emu.grasscutter.scripts.data.SceneMonster;
import emu.grasscutter.scripts.data.SceneSuite; import emu.grasscutter.scripts.data.SceneSuite;
import emu.grasscutter.scripts.data.SceneTrigger; 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.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
...@@ -120,7 +121,7 @@ public class SceneScriptManager { ...@@ -120,7 +121,7 @@ public class SceneScriptManager {
bindings = ScriptLoader.getEngine().createBindings(); bindings = ScriptLoader.getEngine().createBindings();
// Set variables // 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("GadgetState", new ScriptGadgetState());
bindings.put("RegionShape", new ScriptRegionShape()); bindings.put("RegionShape", new ScriptRegionShape());
bindings.put("ScriptLib", getScriptLib()); bindings.put("ScriptLib", getScriptLib());
...@@ -208,76 +209,30 @@ public class SceneScriptManager { ...@@ -208,76 +209,30 @@ public class SceneScriptManager {
// Events // Events
private LuaValue getFunc(String name) { public void callEvent(int eventType, ScriptArgs params) {
return (LuaValue) this.getBindings().get(name); for (SceneTrigger trigger : this.getTriggersByEvent(eventType)) {
} LuaValue condition = null;
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);
if (ret.checkboolean() == true) { if (trigger.condition != null && !trigger.condition.isEmpty()) {
LuaValue action = getFunc(trigger.action); condition = (LuaValue) this.getBindings().get(trigger.condition);
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 ret = LuaValue.TRUE;
LuaValue action = getFunc(trigger.action);
action.call(this.getScriptLibLua(), LuaValue.NIL); if (condition != null) {
LuaValue args = LuaValue.NIL;
if (params != null) {
args = CoerceJavaToLua.coerce(params);
}
ret = condition.call(this.getScriptLibLua(), args);
} }
}
}
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) { if (ret.checkboolean() == true) {
LuaValue action = getFunc(trigger.action); LuaValue action = (LuaValue) this.getBindings().get(trigger.action);
action.call(this.getScriptLibLua(), LuaValue.NIL); 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);
}
}
} }
...@@ -13,8 +13,10 @@ import emu.grasscutter.game.dungeons.DungeonChallenge; ...@@ -13,8 +13,10 @@ import emu.grasscutter.game.dungeons.DungeonChallenge;
import emu.grasscutter.game.entity.EntityGadget; import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity; import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.data.SceneGroup; import emu.grasscutter.scripts.data.SceneGroup;
import emu.grasscutter.scripts.data.SceneMonster; 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.PacketGadgetStateNotify;
import emu.grasscutter.server.packet.send.PacketWorktopOptionNotify; import emu.grasscutter.server.packet.send.PacketWorktopOptionNotify;
...@@ -130,7 +132,7 @@ public class ScriptLib { ...@@ -130,7 +132,7 @@ public class ScriptLib {
getSceneScriptManager().getScene().addEntities(toAdd); getSceneScriptManager().getScene().addEntities(toAdd);
for (GameEntity entity : toAdd) { for (GameEntity entity : toAdd) {
this.getSceneScriptManager().onMonsterSpawn((EntityMonster) entity); this.getSceneScriptManager().callEvent(EventType.EVENT_ANY_MONSTER_LIVE, new ScriptArgs(entity.getConfigId()));
} }
} }
......
package emu.grasscutter.scripts.constants; package emu.grasscutter.scripts.constants;
public class ScriptEventType { public class EventType {
public static final int EVENT_NONE = 0; public static final int EVENT_NONE = 0;
public static final int EVENT_ANY_MONSTER_DIE = 1; public static final int EVENT_ANY_MONSTER_DIE = 1;
public static final int EVENT_ANY_GADGET_DIE = 2; public static final int EVENT_ANY_GADGET_DIE = 2;
......
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;
}
}
package emu.grasscutter.server.packet.recv; 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.Opcodes;
import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.SelectWorktopOptionReqOuterClass.SelectWorktopOptionReq; 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.net.packet.PacketHandler;
import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.game.GameSession;
import emu.grasscutter.server.packet.send.PacketSelectWorktopOptionRsp; import emu.grasscutter.server.packet.send.PacketSelectWorktopOptionRsp;
...@@ -14,9 +18,21 @@ public class HandlerSelectWorktopOptionReq extends PacketHandler { ...@@ -14,9 +18,21 @@ public class HandlerSelectWorktopOptionReq extends PacketHandler {
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
SelectWorktopOptionReq req = SelectWorktopOptionReq.parseFrom(payload); SelectWorktopOptionReq req = SelectWorktopOptionReq.parseFrom(payload);
session.getPlayer().getScene().getScriptManager().onOptionSelect(req.getGadgetEntityId(), req.getOptionId()); try {
GameEntity entity = session.getPlayer().getScene().getEntityById(req.getGadgetEntityId());
session.send(new PacketSelectWorktopOptionRsp(req.getGadgetEntityId(), req.getOptionId()));
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()));
}
} }
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment