Commit eb94adb2 authored by Akka's avatar Akka Committed by Melledy
Browse files

Monsters tide turn by turn && Ban User Skill && Lua functions

parent 29f9d650
...@@ -117,6 +117,7 @@ public class EntityMonster extends GameEntity { ...@@ -117,6 +117,7 @@ public class EntityMonster extends GameEntity {
this.getScene().getDeadSpawnedEntities().add(getSpawnEntry()); this.getScene().getDeadSpawnedEntities().add(getSpawnEntry());
} }
if (getScene().getScriptManager().isInit() && this.getGroupId() > 0) { if (getScene().getScriptManager().isInit() && this.getGroupId() > 0) {
getScene().getScriptManager().onMonsterDie();
getScene().getScriptManager().callEvent(EventType.EVENT_ANY_MONSTER_DIE, null); getScene().getScriptManager().callEvent(EventType.EVENT_ANY_MONSTER_DIE, null);
} }
if (getScene().getChallenge() != null && getScene().getChallenge().getGroup().id == this.getGroupId()) { if (getScene().getChallenge() != null && getScene().getChallenge().getGroup().id == this.getGroupId()) {
......
...@@ -7,6 +7,7 @@ import emu.grasscutter.data.def.TowerLevelData; ...@@ -7,6 +7,7 @@ import emu.grasscutter.data.def.TowerLevelData;
import emu.grasscutter.game.dungeons.DungeonSettleListener; import emu.grasscutter.game.dungeons.DungeonSettleListener;
import emu.grasscutter.game.dungeons.TowerDungeonSettleListener; import emu.grasscutter.game.dungeons.TowerDungeonSettleListener;
import emu.grasscutter.game.player.Player; import emu.grasscutter.game.player.Player;
import emu.grasscutter.server.packet.send.PacketCanUseSkillNotify;
import emu.grasscutter.server.packet.send.PacketTowerCurLevelRecordChangeNotify; import emu.grasscutter.server.packet.send.PacketTowerCurLevelRecordChangeNotify;
import emu.grasscutter.server.packet.send.PacketTowerEnterLevelRsp; import emu.grasscutter.server.packet.send.PacketTowerEnterLevelRsp;
...@@ -75,7 +76,8 @@ public class TowerManager { ...@@ -75,7 +76,8 @@ public class TowerManager {
player.getScene().setPrevScenePoint(enterPointId); player.getScene().setPrevScenePoint(enterPointId);
player.getSession().send(new PacketTowerEnterLevelRsp(currentFloorId, currentLevel)); player.getSession().send(new PacketTowerEnterLevelRsp(currentFloorId, currentLevel));
// stop using skill
player.getSession().send(new PacketCanUseSkillNotify(false));
} }
public void notifyCurLevelRecordChange(){ public void notifyCurLevelRecordChange(){
......
...@@ -106,6 +106,12 @@ public class Scene { ...@@ -106,6 +106,12 @@ public class Scene {
return this.entities.get(id); return this.entities.get(id);
} }
public GameEntity getEntityByConfigId(int configId) {
return this.entities.values().stream()
.filter(x -> x.getConfigId() == configId)
.findFirst()
.orElse(null);
}
/** /**
* @return the autoCloseTime * @return the autoCloseTime
*/ */
......
package emu.grasscutter.scripts; package emu.grasscutter.scripts;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.script.Bindings; import javax.script.Bindings;
import javax.script.CompiledScript; import javax.script.CompiledScript;
import javax.script.ScriptException; import javax.script.ScriptException;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue; import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.CoerceJavaToLua; import org.luaj.vm2.lib.jse.CoerceJavaToLua;
...@@ -23,12 +18,8 @@ import emu.grasscutter.data.def.MonsterData; ...@@ -23,12 +18,8 @@ import emu.grasscutter.data.def.MonsterData;
import emu.grasscutter.data.def.WorldLevelData; import emu.grasscutter.data.def.WorldLevelData;
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.props.EntityType;
import emu.grasscutter.game.world.Scene; import emu.grasscutter.game.world.Scene;
import emu.grasscutter.scripts.constants.EventType; import emu.grasscutter.scripts.constants.EventType;
import emu.grasscutter.scripts.constants.ScriptGadgetState;
import emu.grasscutter.scripts.constants.ScriptRegionShape;
import emu.grasscutter.scripts.data.SceneBlock; import emu.grasscutter.scripts.data.SceneBlock;
import emu.grasscutter.scripts.data.SceneConfig; import emu.grasscutter.scripts.data.SceneConfig;
import emu.grasscutter.scripts.data.SceneGadget; import emu.grasscutter.scripts.data.SceneGadget;
...@@ -56,6 +47,11 @@ public class SceneScriptManager { ...@@ -56,6 +47,11 @@ public class SceneScriptManager {
private final Int2ObjectOpenHashMap<Set<SceneTrigger>> triggers; private final Int2ObjectOpenHashMap<Set<SceneTrigger>> triggers;
private final Int2ObjectOpenHashMap<SceneRegion> regions; private final Int2ObjectOpenHashMap<SceneRegion> regions;
private SceneGroup currentGroup;
private AtomicInteger monsterAlive;
private AtomicInteger monsterTideCount;
private int monsterSceneLimit;
private ConcurrentLinkedQueue<Integer> monsterOrders;
public SceneScriptManager(Scene scene) { public SceneScriptManager(Scene scene) {
this.scene = scene; this.scene = scene;
...@@ -222,7 +218,8 @@ public class SceneScriptManager { ...@@ -222,7 +218,8 @@ public class SceneScriptManager {
cs.eval(getBindings()); cs.eval(getBindings());
// Set // Set
group.monsters = ScriptLoader.getSerializer().toList(SceneMonster.class, bindings.get("monsters")); group.monsters = ScriptLoader.getSerializer().toList(SceneMonster.class, bindings.get("monsters")).stream()
.collect(Collectors.toMap(x -> x.config_id, y -> y));
group.gadgets = ScriptLoader.getSerializer().toList(SceneGadget.class, bindings.get("gadgets")); group.gadgets = ScriptLoader.getSerializer().toList(SceneGadget.class, bindings.get("gadgets"));
group.triggers = ScriptLoader.getSerializer().toList(SceneTrigger.class, bindings.get("triggers")); group.triggers = ScriptLoader.getSerializer().toList(SceneTrigger.class, bindings.get("triggers"));
group.suites = ScriptLoader.getSerializer().toList(SceneSuite.class, bindings.get("suites")); group.suites = ScriptLoader.getSerializer().toList(SceneSuite.class, bindings.get("suites"));
...@@ -235,7 +232,7 @@ public class SceneScriptManager { ...@@ -235,7 +232,7 @@ public class SceneScriptManager {
// Add monsters to suite TODO optimize // Add monsters to suite TODO optimize
Int2ObjectMap<Object> map = new Int2ObjectOpenHashMap<>(); Int2ObjectMap<Object> map = new Int2ObjectOpenHashMap<>();
group.monsters.forEach(m -> map.put(m.config_id, m)); group.monsters.entrySet().forEach(m -> map.put(m.getValue().config_id, m));
group.gadgets.forEach(m -> map.put(m.config_id, m)); group.gadgets.forEach(m -> map.put(m.config_id, m));
for (SceneSuite suite : group.suites) { for (SceneSuite suite : group.suites) {
...@@ -323,27 +320,48 @@ public class SceneScriptManager { ...@@ -323,27 +320,48 @@ public class SceneScriptManager {
} }
public void spawnMonstersInGroup(SceneGroup group, int suiteIndex) { public void spawnMonstersInGroup(SceneGroup group, int suiteIndex) {
spawnMonstersInGroup(group, group.getSuiteByIndex(suiteIndex)); this.currentGroup = group;
this.monsterSceneLimit = 0;
var suite = group.getSuiteByIndex(suiteIndex);
if(suite == null){
return;
}
suite.sceneMonsters.forEach(mob -> spawnMonstersInGroup(group, mob));
} }
public void spawnMonstersInGroup(SceneGroup group) { public void spawnMonstersInGroup(SceneGroup group) {
spawnMonstersInGroup(group, null); this.currentGroup = group;
this.monsterSceneLimit = 0;
group.monsters.values().forEach(mob -> spawnMonstersInGroup(group, mob));
}
public void spawnMonstersInGroup(SceneGroup group,Integer[] ordersConfigId, int tideCount, int sceneLimit) {
this.currentGroup = group;
this.monsterSceneLimit = sceneLimit;
this.monsterTideCount = new AtomicInteger(tideCount);
this.monsterAlive = new AtomicInteger(0);
this.monsterOrders = new ConcurrentLinkedQueue<>(List.of(ordersConfigId));
// add the last turn
group.monsters.keySet().stream()
.filter(i -> !this.monsterOrders.contains(i))
.forEach(this.monsterOrders::add);
for (int i = 0; i < sceneLimit; i++) {
spawnMonstersInGroup(group, group.monsters.get(this.monsterOrders.poll()));
}
}
public void spawnMonstersInGroup(SceneGroup group, SceneMonster monster) {
if(monster == null){
return;
} }
if(this.monsterSceneLimit > 0){
public void spawnMonstersInGroup(SceneGroup group, SceneSuite suite) { this.monsterTideCount.decrementAndGet();
List<SceneMonster> monsters = group.monsters; this.monsterAlive.incrementAndGet();
if (suite != null) {
monsters = suite.sceneMonsters;
} }
List<GameEntity> toAdd = new ArrayList<>();
for (SceneMonster monster : monsters) {
MonsterData data = GameData.getMonsterDataMap().get(monster.monster_id); MonsterData data = GameData.getMonsterDataMap().get(monster.monster_id);
if (data == null) { if (data == null) {
continue; return;
} }
// Calculate level // Calculate level
...@@ -365,18 +383,29 @@ public class SceneScriptManager { ...@@ -365,18 +383,29 @@ public class SceneScriptManager {
entity.setGroupId(group.id); entity.setGroupId(group.id);
entity.setConfigId(monster.config_id); entity.setConfigId(monster.config_id);
toAdd.add(entity); getScene().addEntity(entity);
}
if (toAdd.size() > 0) {
getScene().addEntities(toAdd);
for (GameEntity entity : toAdd) {
callEvent(EventType.EVENT_ANY_MONSTER_LIVE, new ScriptArgs(entity.getConfigId())); callEvent(EventType.EVENT_ANY_MONSTER_LIVE, new ScriptArgs(entity.getConfigId()));
} }
public void onMonsterDie(){
if(this.monsterSceneLimit <= 0){
return;
}
if(this.monsterAlive.decrementAndGet() >= this.monsterSceneLimit) {
// maybe not happen
return;
}
if(this.monsterTideCount.get() > 0){
// add more
spawnMonstersInGroup(this.currentGroup, this.currentGroup.monsters.get(this.monsterOrders.poll()));
}else if(this.monsterAlive.get() == 0){
// spawn the last turn of monsters
while(!this.monsterOrders.isEmpty()){
spawnMonstersInGroup(this.currentGroup, this.currentGroup.monsters.get(this.monsterOrders.poll()));
}
} }
} }
// Events // Events
public void callEvent(int eventType, ScriptArgs params) { public void callEvent(int eventType, ScriptArgs params) {
...@@ -405,4 +434,8 @@ public class SceneScriptManager { ...@@ -405,4 +434,8 @@ public class SceneScriptManager {
} }
} }
} }
// public LuaValue safetyCall(){
//
// }
} }
package emu.grasscutter.scripts; package emu.grasscutter.scripts;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.def.MonsterData;
import emu.grasscutter.game.dungeons.DungeonChallenge; 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.SceneRegion; import emu.grasscutter.scripts.data.SceneRegion;
import emu.grasscutter.scripts.data.ScriptArgs; import emu.grasscutter.server.packet.send.PacketCanUseSkillNotify;
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;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Optional;
public class ScriptLib { public class ScriptLib {
public static final Logger logger = LoggerFactory.getLogger(ScriptLib.class);
private final SceneScriptManager sceneScriptManager; private final SceneScriptManager sceneScriptManager;
public ScriptLib(SceneScriptManager sceneScriptManager) { public ScriptLib(SceneScriptManager sceneScriptManager) {
...@@ -34,6 +30,8 @@ public class ScriptLib { ...@@ -34,6 +30,8 @@ public class ScriptLib {
} }
public int SetGadgetStateByConfigId(int configId, int gadgetState) { public int SetGadgetStateByConfigId(int configId, int gadgetState) {
logger.debug("[LUA] Call SetGadgetStateByConfigId with {},{}",
configId,gadgetState);
Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream() Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e.getConfigId() == configId).findFirst(); .filter(e -> e.getConfigId() == configId).findFirst();
...@@ -53,6 +51,8 @@ public class ScriptLib { ...@@ -53,6 +51,8 @@ public class ScriptLib {
} }
public int SetGroupGadgetStateByConfigId(int groupId, int configId, int gadgetState) { public int SetGroupGadgetStateByConfigId(int groupId, int configId, int gadgetState) {
logger.debug("[LUA] Call SetGroupGadgetStateByConfigId with {},{},{}",
groupId,configId,gadgetState);
List<GameEntity> list = getSceneScriptManager().getScene().getEntities().values().stream() List<GameEntity> list = getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e.getGroupId() == groupId).toList(); .filter(e -> e.getGroupId() == groupId).toList();
...@@ -71,6 +71,8 @@ public class ScriptLib { ...@@ -71,6 +71,8 @@ public class ScriptLib {
} }
public int SetWorktopOptionsByGroupId(int groupId, int configId, int[] options) { public int SetWorktopOptionsByGroupId(int groupId, int configId, int[] options) {
logger.debug("[LUA] Call SetWorktopOptionsByGroupId with {},{},{}",
groupId,configId,options);
Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream() Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst(); .filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst();
...@@ -90,6 +92,8 @@ public class ScriptLib { ...@@ -90,6 +92,8 @@ public class ScriptLib {
} }
public int DelWorktopOptionByGroupId(int groupId, int configId, int option) { public int DelWorktopOptionByGroupId(int groupId, int configId, int option) {
logger.debug("[LUA] Call DelWorktopOptionByGroupId with {},{},{}",groupId,configId,option);
Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream() Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst(); .filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst();
...@@ -109,20 +113,24 @@ public class ScriptLib { ...@@ -109,20 +113,24 @@ public class ScriptLib {
} }
// Some fields are guessed // Some fields are guessed
public int AutoMonsterTide(int challengeIndex, int groupId, int[] config_ids, int param4, int param5, int param6) { public int AutoMonsterTide(int challengeIndex, int groupId, Integer[] ordersConfigId, int tideCount, int sceneLimit, int param6) {
logger.debug("[LUA] Call AutoMonsterTide with {},{},{},{},{},{}",
challengeIndex,groupId,ordersConfigId,tideCount,sceneLimit,param6);
SceneGroup group = getSceneScriptManager().getGroupById(groupId); SceneGroup group = getSceneScriptManager().getGroupById(groupId);
if (group == null || group.monsters == null) { if (group == null || group.monsters == null) {
return 1; return 1;
} }
// TODO just spawn all from group for now this.getSceneScriptManager().spawnMonstersInGroup(group, ordersConfigId, tideCount, sceneLimit);
this.getSceneScriptManager().spawnMonstersInGroup(group);
return 0; return 0;
} }
public int AddExtraGroupSuite(int groupId, int suite) { public int AddExtraGroupSuite(int groupId, int suite) {
logger.debug("[LUA] Call AddExtraGroupSuite with {},{}",
groupId,suite);
SceneGroup group = getSceneScriptManager().getGroupById(groupId); SceneGroup group = getSceneScriptManager().getGroupById(groupId);
if (group == null || group.monsters == null) { if (group == null || group.monsters == null) {
...@@ -136,8 +144,17 @@ public class ScriptLib { ...@@ -136,8 +144,17 @@ public class ScriptLib {
} }
// param3 (probably time limit for timed dungeons) // param3 (probably time limit for timed dungeons)
public int ActiveChallenge(int challengeId, int challengeIndex, int param3, int groupId, int objectiveKills, int param5) { public int ActiveChallenge(int challengeId, int challengeIndex, int timeLimitOrGroupId, int groupId, int objectiveKills, int param5) {
logger.debug("[LUA] Call ActiveChallenge with {},{},{},{},{},{}",
challengeId,challengeIndex,timeLimitOrGroupId,groupId,objectiveKills,param5);
SceneGroup group = getSceneScriptManager().getGroupById(groupId); SceneGroup group = getSceneScriptManager().getGroupById(groupId);
var objective = objectiveKills;
if(group == null){
group = getSceneScriptManager().getGroupById(timeLimitOrGroupId);
objective = groupId;
}
if (group == null || group.monsters == null) { if (group == null || group.monsters == null) {
return 1; return 1;
...@@ -146,7 +163,7 @@ public class ScriptLib { ...@@ -146,7 +163,7 @@ public class ScriptLib {
DungeonChallenge challenge = new DungeonChallenge(getSceneScriptManager().getScene(), group); DungeonChallenge challenge = new DungeonChallenge(getSceneScriptManager().getScene(), group);
challenge.setChallengeId(challengeId); challenge.setChallengeId(challengeId);
challenge.setChallengeIndex(challengeIndex); challenge.setChallengeIndex(challengeIndex);
challenge.setObjective(objectiveKills); challenge.setObjective(objective);
getSceneScriptManager().getScene().setChallenge(challenge); getSceneScriptManager().getScene().setChallenge(challenge);
...@@ -155,26 +172,37 @@ public class ScriptLib { ...@@ -155,26 +172,37 @@ public class ScriptLib {
} }
public int GetGroupMonsterCountByGroupId(int groupId) { public int GetGroupMonsterCountByGroupId(int groupId) {
logger.debug("[LUA] Call GetGroupMonsterCountByGroupId with {}",
groupId);
return (int) getSceneScriptManager().getScene().getEntities().values().stream() return (int) getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e instanceof EntityMonster && e.getGroupId() == groupId) .filter(e -> e instanceof EntityMonster && e.getGroupId() == groupId)
.count(); .count();
} }
public int GetGroupVariableValue(String var) { public int GetGroupVariableValue(String var) {
logger.debug("[LUA] Call GetGroupVariableValue with {}",
var);
return getSceneScriptManager().getVariables().getOrDefault(var, 0); return getSceneScriptManager().getVariables().getOrDefault(var, 0);
} }
public int SetGroupVariableValue(String var, int value) { public int SetGroupVariableValue(String var, int value) {
logger.debug("[LUA] Call SetGroupVariableValue with {},{}",
var, value);
getSceneScriptManager().getVariables().put(var, value); getSceneScriptManager().getVariables().put(var, value);
return 0; return 0;
} }
public LuaValue ChangeGroupVariableValue(String var, int value) { public LuaValue ChangeGroupVariableValue(String var, int value) {
logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
var, value);
getSceneScriptManager().getVariables().put(var, getSceneScriptManager().getVariables().get(var) + value); getSceneScriptManager().getVariables().put(var, getSceneScriptManager().getVariables().get(var) + value);
return LuaValue.ZERO; return LuaValue.ZERO;
} }
public int RefreshGroup(LuaTable table) { public int RefreshGroup(LuaTable table) {
logger.debug("[LUA] Call RefreshGroup with {}",
table);
// Kill and Respawn? // Kill and Respawn?
int groupId = table.get("group_id").toint(); int groupId = table.get("group_id").toint();
int suite = table.get("suite").toint(); int suite = table.get("suite").toint();
...@@ -192,6 +220,8 @@ public class ScriptLib { ...@@ -192,6 +220,8 @@ public class ScriptLib {
} }
public int GetRegionEntityCount(LuaTable table) { public int GetRegionEntityCount(LuaTable table) {
logger.debug("[LUA] Call GetRegionEntityCount with {}",
table);
int regionId = table.get("region_eid").toint(); int regionId = table.get("region_eid").toint();
int entityType = table.get("entity_type").toint(); int entityType = table.get("entity_type").toint();
...@@ -205,21 +235,68 @@ public class ScriptLib { ...@@ -205,21 +235,68 @@ public class ScriptLib {
} }
public void PrintContextLog(String msg) { public void PrintContextLog(String msg) {
Grasscutter.getLogger().info("[LUA] " + msg); logger.info("[LUA] " + msg);
} }
public int TowerCountTimeStatus(int var1, int var2){ public int TowerCountTimeStatus(int isDone, int var2){
logger.debug("[LUA] Call TowerCountTimeStatus with {},{}",
isDone,var2);
// TODO record time
return 0; return 0;
} }
public int GetGroupMonsterCount(int var1){ public int GetGroupMonsterCount(int var1){
// Maybe... logger.debug("[LUA] Call GetGroupMonsterCount with {}",
return GetGroupMonsterCountByGroupId(var1); var1);
return (int) getSceneScriptManager().getScene().getEntities().values().stream()
.filter(e -> e instanceof EntityMonster)
.count();
} }
public int SetMonsterBattleByGroup(int var1, int var2, int var3){ public int SetMonsterBattleByGroup(int var1, int var2, int var3){
logger.debug("[LUA] Call SetMonsterBattleByGroup with {},{},{}",
var1,var2,var3);
return 0; return 0;
} }
public int CauseDungeonFail(int var1){ public int CauseDungeonFail(int var1){
logger.debug("[LUA] Call CauseDungeonFail with {}",
var1);
return 0;
}
// 8-1
public int GetGroupVariableValueByGroup(int var1, String var2, int var3){
logger.debug("[LUA] Call GetGroupVariableValueByGroup with {},{},{}",
var1,var2,var3);
//TODO
return getSceneScriptManager().getVariables().getOrDefault(var2, 0);
}
public int SetIsAllowUseSkill(int canUse, int var2){
logger.debug("[LUA] Call SetIsAllowUseSkill with {},{}",
canUse,var2);
getSceneScriptManager().getScene().broadcastPacket(new PacketCanUseSkillNotify(canUse == 1));
return 0; return 0;
} }
public int KillEntityByConfigId(LuaTable table){
logger.debug("[LUA] Call KillEntityByConfigId with {}",
table);
var configId = table.get("config_id");
if(configId == LuaValue.NIL){
return 1;
}
var entity = getSceneScriptManager().getScene().getEntityByConfigId(configId.toint());
if(entity == null){
return 1;
}
getSceneScriptManager().getScene().killEntity(entity, 0);
return 0;
}
} }
package emu.grasscutter.scripts.data; package emu.grasscutter.scripts.data;
import java.util.List;
import emu.grasscutter.utils.Position; import emu.grasscutter.utils.Position;
import java.util.List;
import java.util.Map;
public class SceneGroup { public class SceneGroup {
public transient int block_id; // Not an actual variable in the scripts but we will keep it here for reference public transient int block_id; // Not an actual variable in the scripts but we will keep it here for reference
...@@ -11,7 +12,10 @@ public class SceneGroup { ...@@ -11,7 +12,10 @@ public class SceneGroup {
public int refresh_id; public int refresh_id;
public Position pos; public Position pos;
public List<SceneMonster> monsters; /**
* ConfigId - Monster
*/
public Map<Integer,SceneMonster> monsters;
public List<SceneGadget> gadgets; public List<SceneGadget> gadgets;
public List<SceneTrigger> triggers; public List<SceneTrigger> triggers;
public List<SceneRegion> regions; public List<SceneRegion> regions;
......
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.CanUseSkillNotifyOuterClass;
public class PacketCanUseSkillNotify extends BasePacket {
public PacketCanUseSkillNotify(boolean canUseSkill) {
super(PacketOpcodes.CanUseSkillNotify);
CanUseSkillNotifyOuterClass.CanUseSkillNotify proto = CanUseSkillNotifyOuterClass.CanUseSkillNotify.newBuilder()
.setIsCanUseSkill(canUseSkill)
.build();
this.setData(proto);
}
}
...@@ -19,4 +19,6 @@ ...@@ -19,4 +19,6 @@
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
<appender-ref ref="FILE" /> <appender-ref ref="FILE" />
</root> </root>
<logger name="emu.grasscutter.scripts.ScriptLib" level="DEBUG">
</logger>
</Configuration> </Configuration>
\ No newline at end of file
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