Skip to content

Commit 10423db

Browse files
committed
fix(ActionServerLuaCall.java): Handle Lua function parameter passing
1 parent 5b9d386 commit 10423db

File tree

3 files changed

+68
-8
lines changed

3 files changed

+68
-8
lines changed

src/main/java/emu/grasscutter/data/binout/AbilityModifier.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ public enum Type {
345345
public DynamicFloat valueRangeMax;
346346
public String overrideMapKey;
347347

348+
public int paramNum;
348349
public DynamicFloat
349350
param1 = DynamicFloat.ZERO,
350351
param2 = DynamicFloat.ZERO,
@@ -359,12 +360,18 @@ public enum Type {
359360
public String content;
360361

361362
public enum LuaCallType {
363+
Gadget,
364+
@SerializedName(value = "OwnerGadegt", alternate = "OwnerGadget")
365+
OwnerGadget,
362366
FromGroup,
363-
CurGalleryControlGroup,
364-
CurChallengeGroup,
367+
OwnerFromGroup,
365368
SpecificGroup,
369+
CurScenePlay,
370+
CurChallengeGroup,
371+
CurRogueBossGroup,
372+
CurGalleryControlGroup,
366373
AbilityGroupSourceGroup,
367-
CurScenePlay
374+
LevelBankZoneContainsGroup
368375
}
369376

370377
public enum DropType {

src/main/java/emu/grasscutter/game/ability/actions/ActionServerLuaCall.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import emu.grasscutter.scripts.ScriptLoader;
99
import javax.script.Bindings;
1010
import org.luaj.vm2.LuaFunction;
11+
import org.luaj.vm2.LuaValue;
1112

1213
@AbilityAction(AbilityModifierAction.Type.ServerLuaCall)
1314
public final class ActionServerLuaCall extends AbilityActionHandler {
@@ -16,12 +17,14 @@ public boolean execute(
1617
Ability ability, AbilityModifierAction action, ByteString abilityData, GameEntity target) {
1718
var scene = target.getScene();
1819
var scriptManager = scene.getScriptManager();
20+
1921
var functionName = action.funcName;
2022

2123
// Set the script library's manager.
2224
var scriptLib = ScriptLoader.getScriptLib();
2325
scriptLib.setCurrentEntity(target);
2426
scriptLib.setSceneScriptManager(scriptManager);
27+
2528
// Attempt to call the function.
2629
return switch (action.luaCallType) {
2730
default -> false;
@@ -33,7 +36,7 @@ public boolean execute(
3336
// Set the script library's group.
3437
scriptLib.setCurrentGroup(group);
3538

36-
yield ActionServerLuaCall.callFunction(script, functionName);
39+
yield ActionServerLuaCall.callFunction(script, functionName, ability, action);
3740
}
3841
case SpecificGroup -> {
3942
var groupId = action.callParamList[0];
@@ -43,7 +46,16 @@ public boolean execute(
4346
// Set the script library's group.
4447
scriptLib.setCurrentGroup(group);
4548

46-
yield ActionServerLuaCall.callFunction(script, functionName);
49+
yield ActionServerLuaCall.callFunction(script, functionName, ability, action);
50+
}
51+
case Gadget -> {
52+
var controller = target.getEntityController();
53+
if (controller == null || functionName.isBlank()) yield false;
54+
55+
// Hand off the function handling to the controller.
56+
controller.callControllerScriptFunc(target, functionName, ability, action);
57+
58+
yield true;
4759
}
4860
};
4961
}
@@ -53,17 +65,32 @@ public boolean execute(
5365
*
5466
* @param bindings The bindings to fetch the function from.
5567
* @param functionName The name of the function to call.
68+
* @param ability The ability data.
69+
* @param action The ability action data.
5670
* @return Whether the function was called successfully.
5771
*/
58-
private static boolean callFunction(Bindings bindings, String functionName) {
72+
private static boolean callFunction(
73+
Bindings bindings, String functionName,
74+
Ability ability, AbilityModifierAction action
75+
) {
5976
try {
6077
// Resolve the function from the script.
6178
var function = bindings.get(functionName);
6279
if (!(function instanceof LuaFunction luaFunction))
6380
throw new Exception("Function is not a LuaFunction.");
6481

65-
// Attempt to invoke the function.
66-
luaFunction.call(ScriptLoader.getScriptLibLua());
82+
// Convert parameters to Lua values.
83+
var lParam1 = LuaValue.valueOf(action.param1.getInt(ability));
84+
var lParam2 = LuaValue.valueOf(action.param2.getInt(ability));
85+
var lParam3 = LuaValue.valueOf(action.param3.getInt(ability));
86+
87+
// Invoke the function with the parameters.
88+
switch (action.paramNum) {
89+
case 1 -> luaFunction.invoke(new LuaValue[] { lParam1 });
90+
case 2 -> luaFunction.invoke(new LuaValue[] { lParam1, lParam2 });
91+
case 3 -> luaFunction.invoke(new LuaValue[] { lParam1, lParam2, lParam3 });
92+
default -> luaFunction.invoke(new LuaValue[] { ScriptLoader.getScriptLibLua() });
93+
}
6794

6895
return true;
6996
} catch (Exception exception) {

src/main/java/emu/grasscutter/scripts/data/controller/EntityController.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package emu.grasscutter.scripts.data.controller;
22

33
import emu.grasscutter.*;
4+
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
5+
import emu.grasscutter.game.ability.Ability;
46
import emu.grasscutter.game.entity.GameEntity;
57
import emu.grasscutter.game.props.ElementType;
68
import emu.grasscutter.scripts.*;
@@ -58,6 +60,30 @@ public int onClientExecuteRequest(GameEntity entity, int param1, int param2, int
5860
return 0;
5961
}
6062

63+
/**
64+
* Invoked from {@link emu.grasscutter.game.ability.actions.ActionServerLuaCall} to call an entity controller function.
65+
*
66+
* @param entity The entity which called the function.
67+
* @param funcName The name of the function to call.
68+
* @param ability The ability that is calling the function.
69+
* @param action The action that is calling the function.
70+
* @return The return value of the function.
71+
*/
72+
public LuaValue callControllerScriptFunc(
73+
GameEntity entity, String funcName,
74+
Ability ability, AbilityModifierAction action) {
75+
var lParam1 = LuaValue.valueOf(action.param1.getInt(ability));
76+
var lParam2 = LuaValue.valueOf(action.param2.getInt(ability));
77+
var lParam3 = LuaValue.valueOf(action.param3.getInt(ability));
78+
79+
return switch (action.paramNum) {
80+
case 1 -> this.callControllerScriptFunc(entity, funcName, lParam1);
81+
case 2 -> this.callControllerScriptFunc(entity, funcName, lParam1, lParam2);
82+
case 3 -> this.callControllerScriptFunc(entity, funcName, lParam1, lParam2, lParam3);
83+
default -> this.callControllerScriptFunc(entity, funcName, LuaValue.NIL);
84+
};
85+
}
86+
6187
// TODO actual execution should probably be handle by EntityControllerScriptManager
6288
private LuaValue callControllerScriptFunc(GameEntity entity, String funcName, LuaValue arg1) {
6389
return callControllerScriptFunc(entity, funcName, arg1, LuaValue.NIL, LuaValue.NIL);

0 commit comments

Comments
 (0)