mirror of
https://github.com/Anime-Game-Servers/Grasscutter-Quests.git
synced 2025-02-17 03:48:12 +00:00
[Abilities] Added ServerLuaTriggerEvent handling and moved actuall lua handling parts from ActionServerLuaCall to SceneScriptManager.callGroupLuaFunction
This commit is contained in:
parent
43f2429645
commit
d565cc1bcb
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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){
|
||||
|
Loading…
x
Reference in New Issue
Block a user