UNPKG

yoni-mcscripts-lib

Version:

为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。

70 lines (69 loc) 2.15 kB
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();