[Abilities] Added ServerLuaTriggerEvent handling and moved actuall lua handling parts from ActionServerLuaCall to SceneScriptManager.callGroupLuaFunction

This commit is contained in:
hartie95 2024-09-25 05:45:05 +02:00
parent 43f2429645
commit d565cc1bcb
4 changed files with 100 additions and 10 deletions

View File

@ -145,12 +145,16 @@ public class AbilityModifier implements Serializable {
public DynamicFloat valueRangeMax;
public String overrideMapKey;
public int paramNum;
public DynamicFloat param1 = DynamicFloat.ZERO;
public DynamicFloat param2 = DynamicFloat.ZERO;
public DynamicFloat param3 = DynamicFloat.ZERO;
public String luaCallType;
public String funcName;
public String sourceName;
@SerializedName(value = "callParamList", alternate = "CallParamList")
public int[] callParamList;
public enum DropType {
LevelControl,

View File

@ -15,20 +15,20 @@ public class ActionServerLuaCall extends AbilityActionHandler {
switch (action.luaCallType) {
case "FromGroup" -> {
val scriptManager = target.getScene().getScriptManager();
val group = scriptManager.getGroupById(target.getGroupId());
val script = group.getScript();
val scriptArgs = new ScriptArgs(target.getGroupId(), 0)
.setTargetEntityId(target.getId())
.setSourceEntityId(target.getId());
val context = new GroupEventLuaContext(script.getEngine(), group, scriptArgs, scriptManager);
try {
//Todo: read MPBMJIGLEMJ for # of arguments.
script.callMethod(action.funcName, context, null);
} catch (Exception e) {
Grasscutter.getLogger().error("Cannot find {} in group {}", context, target.getGroupId());
e.printStackTrace();
val paramsCount = action.paramNum;
val scriptParams = new Integer[paramsCount];
switch (paramsCount){
case 3:
scriptParams[2] = (int) action.param3.get(ability);
case 2:
scriptParams[1] = (int) action.param2.get(ability);
case 1:
scriptParams[0] = (int) action.param1.get(ability);
}
return true;
return scriptManager.callGroupLuaFunction(action.funcName, scriptArgs, (Object[]) scriptParams);
}
default -> {
Grasscutter.getLogger().error("Unimplemented ActionServerLuaCall {}", action.luaCallType);

View File

@ -0,0 +1,50 @@
package emu.grasscutter.game.ability.actions;
import com.github.davidmoten.guavamini.Lists;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.binout.AbilityModifier.AbilityModifierAction;
import emu.grasscutter.game.ability.Ability;
import emu.grasscutter.game.entity.GameEntity;
import lombok.val;
import org.anime_game_servers.gi_lua.models.ScriptArgs;
import org.anime_game_servers.gi_lua.models.constants.EventType;
import java.util.Arrays;
@AbilityAction(AbilityModifierAction.Type.ServerLuaTriggerEvent)
public class ActionServerLuaTriggerEvent extends AbilityActionHandler {
@Override
public boolean execute(Ability ability, AbilityModifierAction action, byte[] abilityData, GameEntity target) {
val scene = target.getScene();
val scriptManager = scene.getScriptManager();
val params = switch (action.luaCallType) {
case "FromGroup" -> {
var groupId = target.getGroupId();
yield Lists.newArrayList(new ScriptArgs(groupId, EventType.EVENT_LUA_NOTIFY));
}
case "SpecificGroup" -> Arrays.stream(action.callParamList)
.mapToObj(groupId -> new ScriptArgs(groupId, EventType.EVENT_LUA_NOTIFY))
.toList();
default -> {
Grasscutter.getLogger().error("Unimplemented ActionServerLuaCall {}", action.luaCallType);
yield null;
}
};
if(params == null) return false;
params.forEach(p -> {
p.setTargetEntityId(target.getId());
p.setSourceEntityId(target.getId());
p.setEventSource(action.sourceName);
p.setParam1( (int) action.param1.get(ability));
p.setParam2( (int) action.param2.get(ability));
p.setParam3( (int) action.param3.get(ability));
scriptManager.callEvent(p);
});
return true;
}
}

View File

@ -806,6 +806,42 @@ public class SceneScriptManager {
}
}
public boolean callGroupLuaFunction(String funcName, ScriptArgs params, Object... args) {
val groupId = params.groupId;
val group = getGroupById(groupId);
if(group == null){
logger.error("callLuaFunction group is null");
return false;
}
val script = group.getScript();
if(script==null){
logger.warn("callScriptFunc script is null");
return false;
}
if(funcName.isEmpty()){
logger.warn("callScriptFunc funcName is empty");
return false;
}
if(!script.hasMethod(funcName)){
logger.warn("callScriptFunc script has no method {}",funcName);
return false;
}
val context = new GroupEventLuaContext(script.getEngine(), group, params, this);
try{
val luaArgs = new Object[args.length+1];
luaArgs[0] = context;
System.arraycopy(args, 0, luaArgs, 1, args.length);
val result = script.callMethod(funcName, luaArgs);
return true;
} catch (RuntimeException | ScriptException | NoSuchMethodException error){
logger.error("[LUA] call trigger failed in group {} with {},{}", group.getGroupInfo().getId(),funcName,params,error);
return false;
}
}
private LuaValue callScriptFunc(@Nonnull String funcName, SceneGroup group, ScriptArgs params) {
val script = group.getScript();
if(script==null){