mirror of
https://github.com/Melledy/Grasscutter.git
synced 2024-11-25 15:22:16 +00:00
Implement time axis
This commit is contained in:
parent
e7410a0be5
commit
6a421336df
@ -1,7 +1,5 @@
|
|||||||
package emu.grasscutter.scripts;
|
package emu.grasscutter.scripts;
|
||||||
|
|
||||||
import static emu.grasscutter.scripts.constants.EventType.EVENT_TIMER_EVENT;
|
|
||||||
|
|
||||||
import com.github.davidmoten.rtreemulti.RTree;
|
import com.github.davidmoten.rtreemulti.RTree;
|
||||||
import com.github.davidmoten.rtreemulti.geometry.Geometry;
|
import com.github.davidmoten.rtreemulti.geometry.Geometry;
|
||||||
import emu.grasscutter.Grasscutter;
|
import emu.grasscutter.Grasscutter;
|
||||||
@ -21,17 +19,20 @@ import emu.grasscutter.server.packet.send.PacketGroupSuiteNotify;
|
|||||||
import emu.grasscutter.utils.*;
|
import emu.grasscutter.utils.*;
|
||||||
import io.netty.util.concurrent.FastThreadLocalThread;
|
import io.netty.util.concurrent.FastThreadLocalThread;
|
||||||
import it.unimi.dsi.fastutil.ints.*;
|
import it.unimi.dsi.fastutil.ints.*;
|
||||||
|
import kotlin.Pair;
|
||||||
|
import lombok.val;
|
||||||
|
import org.luaj.vm2.*;
|
||||||
|
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
|
||||||
|
|
||||||
|
import javax.annotation.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import javax.annotation.*;
|
|
||||||
import kotlin.Pair;
|
import static emu.grasscutter.scripts.constants.EventType.EVENT_TIMER_EVENT;
|
||||||
import lombok.val;
|
|
||||||
import org.luaj.vm2.*;
|
|
||||||
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
|
|
||||||
|
|
||||||
public class SceneScriptManager {
|
public class SceneScriptManager {
|
||||||
private final Scene scene;
|
private final Scene scene;
|
||||||
@ -39,6 +40,9 @@ public class SceneScriptManager {
|
|||||||
private SceneMeta meta;
|
private SceneMeta meta;
|
||||||
private boolean isInit;
|
private boolean isInit;
|
||||||
|
|
||||||
|
private final Map<String, SceneTimeAxis> timeAxis
|
||||||
|
= new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/** current triggers controlled by RefreshGroup */
|
/** current triggers controlled by RefreshGroup */
|
||||||
private final Map<Integer, Set<SceneTrigger>> currentTriggers;
|
private final Map<Integer, Set<SceneTrigger>> currentTriggers;
|
||||||
|
|
||||||
@ -1198,6 +1202,28 @@ public class SceneScriptManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a new time axis for this scene.
|
||||||
|
* Starts the time axis after.
|
||||||
|
*
|
||||||
|
* @param timeAxis The time axis.
|
||||||
|
*/
|
||||||
|
public void initTimeAxis(SceneTimeAxis timeAxis) {
|
||||||
|
this.timeAxis.put(timeAxis.getIdentifier(), timeAxis);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Terminates a time axis.
|
||||||
|
*
|
||||||
|
* @param identifier The identifier of the time axis.
|
||||||
|
*/
|
||||||
|
public void stopTimeAxis(String identifier) {
|
||||||
|
var timeAxis = this.timeAxis.get(identifier);
|
||||||
|
if (timeAxis != null) {
|
||||||
|
timeAxis.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
activeGroupTimers.forEach(
|
activeGroupTimers.forEach(
|
||||||
(gid, times) ->
|
(gid, times) ->
|
||||||
|
50
src/main/java/emu/grasscutter/scripts/SceneTimeAxis.java
Normal file
50
src/main/java/emu/grasscutter/scripts/SceneTimeAxis.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package emu.grasscutter.scripts;
|
||||||
|
|
||||||
|
import emu.grasscutter.scripts.constants.EventType;
|
||||||
|
import emu.grasscutter.scripts.data.ScriptArgs;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public final class SceneTimeAxis {
|
||||||
|
private final Timer timer = new Timer();
|
||||||
|
|
||||||
|
private final SceneScriptManager handle;
|
||||||
|
private final int groupId;
|
||||||
|
|
||||||
|
private final String identifier;
|
||||||
|
private final int delay;
|
||||||
|
private final boolean loop;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the task to run.
|
||||||
|
*/
|
||||||
|
public void start() {
|
||||||
|
if (this.loop) {
|
||||||
|
this.timer.scheduleAtFixedRate(
|
||||||
|
new Task(), this.delay, this.delay);
|
||||||
|
} else {
|
||||||
|
this.timer.schedule(new Task(), this.delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Terminates a repeating task.
|
||||||
|
*/
|
||||||
|
public void stop() {
|
||||||
|
this.timer.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
final class Task extends TimerTask {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// Invoke script event.
|
||||||
|
SceneTimeAxis.this.handle.callEvent(new ScriptArgs(
|
||||||
|
SceneTimeAxis.this.groupId,
|
||||||
|
EventType.EVENT_TIME_AXIS_PASS
|
||||||
|
).setEventSource(SceneTimeAxis.this.identifier));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -956,14 +956,27 @@ public class ScriptLib {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int InitTimeAxis(String var1, int[] var2, boolean var3){
|
public int InitTimeAxis(String identifier, int[] delays, boolean shouldLoop) {
|
||||||
logger.warn("[LUA] Call unimplemented InitTimeAxis with {} {} {}", var1, var2, var3);
|
if (this.getCurrentGroup().isEmpty()) {
|
||||||
//TODO implement var1 == name? var2 == delay? var3 == should loop?
|
logger.warn("[LUA] Call InitTimeAxis without a group");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
public int EndTimeAxis(String var1){
|
|
||||||
logger.warn("[LUA] Call unimplemented EndTimeAxis with {}", var1);
|
var scriptManager = this.getSceneScriptManager();
|
||||||
//TODO implement var1 == name?
|
var group = this.getCurrentGroup().get();
|
||||||
|
|
||||||
|
// Create a new time axis instance.
|
||||||
|
scriptManager.initTimeAxis(new SceneTimeAxis(
|
||||||
|
scriptManager, group.id,
|
||||||
|
identifier, delays[0], shouldLoop
|
||||||
|
));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int EndTimeAxis(String identifier) {
|
||||||
|
this.getSceneScriptManager().stopTimeAxis(identifier);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user