yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
70 lines (69 loc) • 2.15 kB
JavaScript
import { LegacyEventTypes as EventTypes, LegacyEventSignal as EventSignal, LegacyEventTriggerBuilder as EventTriggerBuilder } from "../../legacy_event.js";
import { PlayerEvent } from "./PlayerEvent";
import { YoniScheduler, Schedule } from "../../schedule.js";
import { world as World } from "../../remix/world.js";
import "./PlayerDeadEvent.js";
export class PlayerRespawnEventSignal extends EventSignal {
}
export class PlayerRespawnEvent extends PlayerEvent {
sourceLocation;
currentLocation;
constructor(player, coords) {
super(player);
this.sourceLocation = coords;
this.currentLocation = this.player.location;
}
}
const DeadPlayers = new WeakSet();
const DeadPlayerLocationRecords = new WeakMap();
/**
* @type {number}
*/
let eventId0;
const schedule = new Schedule({
async: false,
type: Schedule.cycleTickSchedule,
delay: 0,
period: 1
}, () => {
let players = Array.from(World.getPlayers());
if (players.length === 0) {
YoniScheduler.removeSchedule(schedule);
return;
}
players.forEach(player => {
if (!DeadPlayers.has(player)) {
return;
}
if (player.getCurrentHealth() > 0) {
let location = DeadPlayerLocationRecords.get(player);
DeadPlayers.delete(player);
DeadPlayerLocationRecords.delete(player);
trigger.fireEvent(player, location);
}
});
});
;
function start() {
EventTypes.get("yoni:playerDead").subscribe(onDead);
}
function onDead(event) {
let player = event.player;
let location = player.location;
DeadPlayers.add(player);
DeadPlayerLocationRecords.set(player, location);
if (!schedule.isQueued()) {
YoniScheduler.addSchedule(schedule);
}
}
function stop() {
EventTypes.get("yoni:playerDead").unsubscribe(onDead);
YoniScheduler.removeSchedule(schedule);
}
const trigger = new EventTriggerBuilder("yoni:playerRespawn")
.eventSignalClass(PlayerRespawnEventSignal)
.eventClass(PlayerRespawnEvent)
.whenFirstSubscribe(start)
.whenLastUnsubscribe(stop)
.build()
.registerEvent();