diff --git a/src/main/java/emu/grasscutter/game/talk/TalkManager.java b/src/main/java/emu/grasscutter/game/talk/TalkManager.java index 16a0a2c28..3a61901b3 100644 --- a/src/main/java/emu/grasscutter/game/talk/TalkManager.java +++ b/src/main/java/emu/grasscutter/game/talk/TalkManager.java @@ -23,7 +23,7 @@ public final class TalkManager extends BasePlayerManager { */ public void triggerTalkAction(int talkId) { var talkData = GameData.getTalkConfigDataMap().get(talkId); - if (talkData == null || talkData.getFinishExec().isEmpty()) return; + if (talkData == null) return; var player = this.getPlayer(); // Execute the talk action on associated handlers. diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestGlobalVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestGlobalVar.java new file mode 100644 index 000000000..95084eff3 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestGlobalVar.java @@ -0,0 +1,21 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_DEC_QUEST_GLOBAL_VAR) +public final class ExecDecQuestGlobalVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 2) return; + + player.getQuestManager().decQuestGlobalVarValue( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestVar.java new file mode 100644 index 000000000..d298f4c8a --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecDecQuestVar.java @@ -0,0 +1,27 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.quest.GameMainQuest; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_DEC_QUEST_VAR) +public final class ExecDecQuestVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 3) return; + + GameMainQuest mainQuest = player.getQuestManager().getMainQuestById( + Integer.parseInt(execParam.getParam()[2]) + ); + if (mainQuest == null) return; + + mainQuest.decQuestVar( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestGlobalVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestGlobalVar.java new file mode 100644 index 000000000..199857e7d --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestGlobalVar.java @@ -0,0 +1,21 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_INC_QUEST_GLOBAL_VAR) +public final class ExecIncQuestGlobalVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 2) return; + + player.getQuestManager().incQuestGlobalVarValue( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestVar.java new file mode 100644 index 000000000..b372c9267 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecIncQuestVar.java @@ -0,0 +1,27 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.quest.GameMainQuest; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_INC_QUEST_VAR) +public final class ExecIncQuestVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 3) return; + + GameMainQuest mainQuest = player.getQuestManager().getMainQuestById( + Integer.parseInt(execParam.getParam()[2]) + ); + if (mainQuest == null) return; + + mainQuest.incQuestVar( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecSetGameTime.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetGameTime.java new file mode 100644 index 000000000..a051a2caf --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetGameTime.java @@ -0,0 +1,18 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_SET_GAME_TIME) +public final class ExecSetGameTime extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 1) return; + + player.getWorld().changeTime(Integer.parseInt(execParam.getParam()[0]), 0); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestGlobalVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestGlobalVar.java new file mode 100644 index 000000000..bde783377 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestGlobalVar.java @@ -0,0 +1,21 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_SET_QUEST_GLOBAL_VAR) +public final class ExecSetQuestGlobalVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 2) return; + + player.getQuestManager().setQuestGlobalVarValue( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestVar.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestVar.java new file mode 100644 index 000000000..6f64c6b4b --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecSetQuestVar.java @@ -0,0 +1,27 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.quest.GameMainQuest; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; + +@TalkValueExec(TalkExec.TALK_EXEC_SET_QUEST_VAR) +public final class ExecSetQuestVar extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + if (execParam.getParam().length < 3) return; + + var mainQuest = player.getQuestManager().getMainQuestById( + Integer.parseInt(execParam.getParam()[2]) + ); + if (mainQuest == null) return; + + mainQuest.setQuestVar( + Integer.parseInt(execParam.getParam()[0]), + Integer.parseInt(execParam.getParam()[1]) + ); + } +} diff --git a/src/main/java/emu/grasscutter/game/talk/exec/ExecTransSceneDummyPoint.java b/src/main/java/emu/grasscutter/game/talk/exec/ExecTransSceneDummyPoint.java new file mode 100644 index 000000000..43d0d5334 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/talk/exec/ExecTransSceneDummyPoint.java @@ -0,0 +1,39 @@ +package emu.grasscutter.game.talk.exec; + +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.binout.ScriptSceneData; +import emu.grasscutter.data.excels.TalkConfigData; +import emu.grasscutter.data.excels.TalkConfigData.TalkExecParam; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.talk.TalkExec; +import emu.grasscutter.game.talk.TalkExecHandler; +import emu.grasscutter.game.talk.TalkValueExec; +import emu.grasscutter.utils.Position; + +@TalkValueExec(TalkExec.TALK_EXEC_TRANS_SCENE_DUMMY_POINT) +public final class ExecTransSceneDummyPoint extends TalkExecHandler { + @Override + public void execute(Player player, TalkConfigData talkData, TalkExecParam execParam) { + // param[0] == sceneid, param[1] == position + if (execParam.getParam().length < 2) return; + + var fullGlobals = GameData.getScriptSceneDataMap().get("flat.luas.scenes.full_globals.lua.json"); + if (fullGlobals == null) return; + + var dummyPointScript = fullGlobals.getScriptObjectList() + .get(execParam.getParam()[0] + "/scene" + execParam.getParam()[0] + "_dummy_points.lua"); + if (dummyPointScript == null) return; + + var dummyPointMap = dummyPointScript.getDummyPoints(); + if (dummyPointMap == null) return; + + var transmitPosPos = dummyPointMap.get(execParam.getParam()[1] + ".pos"); + // List transmitPosRot = dummyPointMap.get(e.getParam()[1] + ".rot"); would be useful when transportation consider rotation + if (transmitPosPos == null || transmitPosPos.isEmpty()) return; + + player.getWorld().transferPlayerToScene( + player, + Integer.parseInt(execParam.getParam()[0]), + new Position(transmitPosPos.get(0), transmitPosPos.get(1), transmitPosPos.get(2))); + } +}