UNPKG

yoni-mcscripts-lib

Version:

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

58 lines (49 loc) 1.87 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 { Player } from "../../remix/entity/index.js"; import "./PlayerJoinedEvent.js"; export class PlayerDeadEvent extends PlayerEvent { constructor(player: Player){ super(player); } } export class PlayerDeadEventSignal extends EventSignal {} let eventId0 : number; let eventId1 : number; const deadPlayers = new WeakSet<Player>(); 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: PlayerEvent){ if (event.player.getCurrentHealth() <= 0) { deadPlayers.add(event.player); } }