ScriptLib.java 10.9 KB
Newer Older
1
2
3
4
5
6
7
package emu.grasscutter.scripts;

import emu.grasscutter.game.dungeons.DungeonChallenge;
import emu.grasscutter.game.entity.EntityGadget;
import emu.grasscutter.game.entity.EntityMonster;
import emu.grasscutter.game.entity.GameEntity;
import emu.grasscutter.scripts.data.SceneGroup;
Melledy's avatar
Melledy committed
8
import emu.grasscutter.scripts.data.SceneRegion;
9
import emu.grasscutter.server.packet.send.PacketCanUseSkillNotify;
10
11
import emu.grasscutter.server.packet.send.PacketGadgetStateNotify;
import emu.grasscutter.server.packet.send.PacketWorktopOptionNotify;
12
13
14
15
16
17
18
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;
19
20

public class ScriptLib {
21
	public static final Logger logger = LoggerFactory.getLogger(ScriptLib.class);
22
23
24
25
26
27
28
29
30
	private final SceneScriptManager sceneScriptManager;
	
	public ScriptLib(SceneScriptManager sceneScriptManager) {
		this.sceneScriptManager = sceneScriptManager;
	}

	public SceneScriptManager getSceneScriptManager() {
		return sceneScriptManager;
	}
31
32
33
34
35
36
37
38
39
40
41

	private String printTable(LuaTable table){
		StringBuilder sb = new StringBuilder();
		sb.append("{");
		for(var meta : table.keys()){
			sb.append(meta).append(":").append(table.get(meta)).append(",");
		}
		sb.append("}");
		return sb.toString();
	}

42
	public int SetGadgetStateByConfigId(int configId, int gadgetState) {
43
44
		logger.debug("[LUA] Call SetGadgetStateByConfigId with {},{}",
				configId,gadgetState);
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
		Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
				.filter(e -> e.getConfigId() == configId).findFirst();

		if (entity.isEmpty()) {
			return 1;
		}
		
		if (!(entity.get() instanceof EntityGadget)) {
			return 1;
		}
		
		EntityGadget gadget = (EntityGadget) entity.get();
		gadget.setState(gadgetState);
		
		getSceneScriptManager().getScene().broadcastPacket(new PacketGadgetStateNotify(gadget, gadgetState));
		return 0;
	}

	public int SetGroupGadgetStateByConfigId(int groupId, int configId, int gadgetState) {
64
65
		logger.debug("[LUA] Call SetGroupGadgetStateByConfigId with {},{},{}",
				groupId,configId,gadgetState);
66
67
68
69
		List<GameEntity> list = getSceneScriptManager().getScene().getEntities().values().stream()
												.filter(e -> e.getGroupId() == groupId).toList();
		
		for (GameEntity entity : list) {
Melledy's avatar
Melledy committed
70
71
72
73
			if (!(entity instanceof EntityGadget)) {
				continue;
			}
			
74
75
76
77
78
79
80
81
82
83
			EntityGadget gadget = (EntityGadget) entity;
			gadget.setState(gadgetState);
			
			getSceneScriptManager().getScene().broadcastPacket(new PacketGadgetStateNotify(gadget, gadgetState));
		}
		
		return 0;
	}
	
	public int SetWorktopOptionsByGroupId(int groupId, int configId, int[] options) {
84
85
		logger.debug("[LUA] Call SetWorktopOptionsByGroupId with {},{},{}",
				groupId,configId,options);
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
		Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
				.filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst();

		if (entity.isEmpty()) {
			return 1;
		}
		
		if (!(entity.get() instanceof EntityGadget)) {
			return 1;
		}
		
		EntityGadget gadget = (EntityGadget) entity.get();
		gadget.addWorktopOptions(options);

		getSceneScriptManager().getScene().broadcastPacket(new PacketWorktopOptionNotify(gadget));
		return 0;
	}
	
	public int DelWorktopOptionByGroupId(int groupId, int configId, int option) {
105
106
		logger.debug("[LUA] Call DelWorktopOptionByGroupId with {},{},{}",groupId,configId,option);

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
		Optional<GameEntity> entity = getSceneScriptManager().getScene().getEntities().values().stream()
				.filter(e -> e.getConfigId() == configId && e.getGroupId() == groupId).findFirst();

		if (entity.isEmpty()) {
			return 1;
		}
		
		if (!(entity.get() instanceof EntityGadget)) {
			return 1;
		}
		
		EntityGadget gadget = (EntityGadget) entity.get();
		gadget.removeWorktopOption(option);
		
		getSceneScriptManager().getScene().broadcastPacket(new PacketWorktopOptionNotify(gadget));
		return 0;
	}
	
	// Some fields are guessed
126
127
128
129
	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);

130
		SceneGroup group = getSceneScriptManager().getGroupById(groupId);
131

132
133
134
		if (group == null || group.monsters == null) {
			return 1;
		}
135

136
		this.getSceneScriptManager().startMonsterTideInGroup(group, ordersConfigId, tideCount, sceneLimit);
137
138
139
140
		
		return 0;
	}
	
141
	public int AddExtraGroupSuite(int groupId, int suite) {
142
143
		logger.debug("[LUA] Call AddExtraGroupSuite with {},{}",
				groupId,suite);
Melledy's avatar
Melledy committed
144
145
146
147
148
		SceneGroup group = getSceneScriptManager().getGroupById(groupId);
		
		if (group == null || group.monsters == null) {
			return 1;
		}
149

150
151
152
153
154
155
		// avoid spawn wrong monster
		if(getSceneScriptManager().getScene().getChallenge() != null)
			if(!getSceneScriptManager().getScene().getChallenge().inProgress() ||
					getSceneScriptManager().getScene().getChallenge().getGroup().id != groupId){
			return 0;
		}
Melledy's avatar
Melledy committed
156
		this.getSceneScriptManager().spawnMonstersInGroup(group, suite);
Melledy's avatar
Melledy committed
157
		
Melledy's avatar
Melledy committed
158
159
160
		return 0;
	}
	
Melledy's avatar
Melledy committed
161
	// param3 (probably time limit for timed dungeons)
162
163
164
165
	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);

166
		SceneGroup group = getSceneScriptManager().getGroupById(groupId);
167
168
169
170
171
172
		var objective = objectiveKills;

		if(group == null){
			group = getSceneScriptManager().getGroupById(timeLimitOrGroupId);
			objective = groupId;
		}
173
174
175
176
		
		if (group == null || group.monsters == null) {
			return 1;
		}
177
178
179
180
181
182
183

		if(getSceneScriptManager().getScene().getChallenge() != null &&
				getSceneScriptManager().getScene().getChallenge().inProgress())
		{
			return 0;
		}

184
185
186
187
188
		DungeonChallenge challenge = new DungeonChallenge(getSceneScriptManager().getScene(),
				group, challengeId, challengeIndex, objective);
		// set if tower first stage (6-1)
		challenge.setStage(getSceneScriptManager().getVariables().getOrDefault("stage", -1) == 0);

189
		getSceneScriptManager().getScene().setChallenge(challenge);
190

191
192
193
194
		challenge.start();
		return 0;
	}
	
195
	public int GetGroupMonsterCountByGroupId(int groupId) {
196
197
		logger.debug("[LUA] Call GetGroupMonsterCountByGroupId with {}",
				groupId);
198
199
200
201
202
		return (int) getSceneScriptManager().getScene().getEntities().values().stream()
								.filter(e -> e instanceof EntityMonster && e.getGroupId() == groupId)
								.count();
	}
	
Melledy's avatar
Melledy committed
203
	public int GetGroupVariableValue(String var) {
204
205
		logger.debug("[LUA] Call GetGroupVariableValue with {}",
				var);
Melledy's avatar
Melledy committed
206
		return getSceneScriptManager().getVariables().getOrDefault(var, 0);
207
208
	}
	
209
	public int SetGroupVariableValue(String var, int value) {
210
211
		logger.debug("[LUA] Call SetGroupVariableValue with {},{}",
				var, value);
212
		getSceneScriptManager().getVariables().put(var, value);
213
214
215
216
		return 0;
	}
	
	public LuaValue ChangeGroupVariableValue(String var, int value) {
217
218
219
		logger.debug("[LUA] Call ChangeGroupVariableValue with {},{}",
				var, value);

220
		getSceneScriptManager().getVariables().put(var, getSceneScriptManager().getVariables().get(var) + value);
221
222
		return LuaValue.ZERO;
	}
223
224
225
226

	/**
	 * Set the actions and triggers to designated group
	 */
227
	public int RefreshGroup(LuaTable table) {
228
		logger.debug("[LUA] Call RefreshGroup with {}",
229
				printTable(table));
230
231
232
233
234
235
236
237
238
239
		// Kill and Respawn?
		int groupId = table.get("group_id").toint();
		int suite = table.get("suite").toint();
		
		SceneGroup group = getSceneScriptManager().getGroupById(groupId);
		
		if (group == null || group.monsters == null) {
			return 1;
		}
		
240
		getSceneScriptManager().refreshGroup(group, suite);
241
		
242
243
244
		return 0;
	}
	
Melledy's avatar
Melledy committed
245
	public int GetRegionEntityCount(LuaTable table) {
246
247
		logger.debug("[LUA] Call GetRegionEntityCount with {}",
				table);
Melledy's avatar
Melledy committed
248
249
250
251
252
253
254
255
256
257
258
259
		int regionId = table.get("region_eid").toint();
		int entityType = table.get("entity_type").toint();

		SceneRegion region = this.getSceneScriptManager().getRegionById(regionId);
		
		if (region == null) {
			return 0;
		}

		return (int) region.getEntities().intStream().filter(e -> e >> 24 == entityType).count();
	}
	
260
	public void PrintContextLog(String msg) {
261
		logger.info("[LUA] " + msg);
262
	}
Akka's avatar
Akka committed
263

264
265
266
267
	public int TowerCountTimeStatus(int isDone, int var2){
		logger.debug("[LUA] Call TowerCountTimeStatus with {},{}",
				isDone,var2);
		// TODO record time
Akka's avatar
Akka committed
268
269
270
		return 0;
	}
	public int GetGroupMonsterCount(int var1){
271
272
273
274
		logger.debug("[LUA] Call GetGroupMonsterCount with {}",
				var1);

		return (int) getSceneScriptManager().getScene().getEntities().values().stream()
275
				.filter(e -> e instanceof EntityMonster && e.getGroupId() == getSceneScriptManager().getCurrentGroup().id)
276
				.count();
Akka's avatar
Akka committed
277
278
	}
	public int SetMonsterBattleByGroup(int var1, int var2, int var3){
279
280
		logger.debug("[LUA] Call SetMonsterBattleByGroup with {},{},{}",
				var1,var2,var3);
281
		// TODO
Akka's avatar
Akka committed
282
283
284
285
		return 0;
	}

	public int CauseDungeonFail(int var1){
286
287
288
289
290
		logger.debug("[LUA] Call CauseDungeonFail with {}",
				var1);

		return 0;
	}
291

292
293
294
	public int GetGroupVariableValueByGroup(String name, int groupId){
		logger.debug("[LUA] Call GetGroupVariableValueByGroup with {},{}",
				name,groupId);
295

296
		return getSceneScriptManager().getVariables().getOrDefault(name, 0);
297
298
299
300
301
302
303
304
305
306
307
308
	}

	public int SetIsAllowUseSkill(int canUse, int var2){
		logger.debug("[LUA] Call SetIsAllowUseSkill with {},{}",
				canUse,var2);

		getSceneScriptManager().getScene().broadcastPacket(new PacketCanUseSkillNotify(canUse == 1));
		return 0;
	}

	public int KillEntityByConfigId(LuaTable table){
		logger.debug("[LUA] Call KillEntityByConfigId with {}",
309
				printTable(table));
310
311
312
313
314
315
316
317
318
319
		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);
Akka's avatar
Akka committed
320
321
		return 0;
	}
322

323
324
325
326
	public int SetGroupVariableValueByGroup(String key, int value, int groupId){
		logger.debug("[LUA] Call SetGroupVariableValueByGroup with {},{},{}",
				key,value,groupId);

327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
		getSceneScriptManager().getVariables().put(key, value);
		return 0;
	}

	public int CreateMonster(LuaTable table){
		logger.debug("[LUA] Call CreateMonster with {}",
				printTable(table));
		var configId = table.get("config_id").toint();
		var delayTime = table.get("delay_time").toint();

		getSceneScriptManager().spawnMonstersByConfigId(configId, delayTime);
		return 0;
	}

	public int TowerMirrorTeamSetUp(int team, int var1) {
		logger.debug("[LUA] Call TowerMirrorTeamSetUp with {},{}",
				team,var1);

345
		getSceneScriptManager().unloadCurrentMonsterTide();
346
347
		getSceneScriptManager().getScene().getPlayers().get(0).getTowerManager().mirrorTeamSetUp(team-1);

348
349
350
		return 0;
	}

351
352
353
354
355
356
357
358
359
	public int CreateGadget(LuaTable table){
		logger.debug("[LUA] Call CreateGadget with {}",
				printTable(table));
		var configId = table.get("config_id").toint();

		//TODO

		return 0;
	}
360
}