UNPKG

yoni-mcscripts-lib

Version:

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

49 lines (48 loc) 1.67 kB
import { world as World } from "../../remix/world.js"; import { YoniScheduler } from "../../schedule.js"; import { PlayerEvent } from "./PlayerEvent.js"; import { LegacyEventTriggerBuilder as EventTriggerBuilder, LegacyEventTypes as EventTypes, LegacyEventSignal as EventSignal } from "../../legacy_event.js"; import "./PlayerJoinedEvent.js"; export class PlayerDeadEvent extends PlayerEvent { constructor(player) { super(player); } } export class PlayerDeadEventSignal extends EventSignal { } let eventId0; let eventId1; const deadPlayers = new WeakSet(); const trigger = new EventTriggerBuilder() .id("yoni:playerDead") .eventSignalClass(PlayerDeadEventSignal) .eventClass(PlayerDeadEvent) .whenFirstSubscribe(() => { eventId0 = YoniScheduler.runCycleTickTask(() => { let alivePlayers = Array.from(World.selectEntities({ type: "minecraft:player" })); let allPlayers = World.getAllPlayers(); for (let player of allPlayers) { if (alivePlayers.includes(player)) { deadPlayers.delete(player); continue; } else if (deadPlayers.has(player)) { continue; } deadPlayers.add(player); trigger.triggerEvent(player); } }, 0, 1); EventTypes.get("yoni:playerJoined").subscribe(onHurt); }) .whenLastUnsubscribe(() => { YoniScheduler.removeSchedule(eventId0); EventTypes.get("yoni:playerJoined").unsubscribe(onHurt); }) .build() .registerEvent(); function onHurt(event) { if (event.player.getCurrentHealth() <= 0) { deadPlayers.add(event.player); } }