UNPKG

yoni-mcscripts-lib

Version:

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

64 lines (54 loc) 1.75 kB
import { LegacyEventTypes as EventTypes, LegacyEventSignal as EventSignal, LegacyEventTriggerBuilder as EventTriggerBuilder } from "../../legacy_event.js"; import { PlayerEvent } from "./PlayerEvent.js"; import { VanillaWorld, Minecraft } from "../../basis.js"; import { YoniScheduler, Schedule } from "../../schedule.js"; export class PlayerJoinedEvent extends PlayerEvent { constructor(player){ super(player); } async kickPlayer(){ await this.player.kick("加入游戏被取消"); } } export class PlayerJoinedEventSignal extends EventSignal { } const joiningPlayers = new Set(); /** * @type {number | null} */ let eventId = null; const schedule = new Schedule({ type: Schedule.cycleTickSchedule, async: false, delay: 0, period: 0 }, () => { if (joiningPlayers.size === 0){ return; } let onlinePlayers = Array.from(VanillaWorld.getPlayers()); joiningPlayers.forEach((plName)=>{ let pl = onlinePlayers.find(pl => pl.name === plName); if (pl != null){ joiningPlayers.delete(plName); trigger.triggerEvent(pl); } }); }); const trigger = new EventTriggerBuilder() .id("yoni:playerJoined") .eventSignalClass(PlayerJoinedEventSignal) .eventClass(PlayerJoinedEvent) .whenFirstSubscribe(()=>{ YoniScheduler.addSchedule(schedule); EventTypes.get("minecraft:afterEvents.playerJoin").subscribe(onJoin); }) .whenLastUnsubscribe(()=>{ YoniScheduler.removeSchedule(schedule); EventTypes.get("minecraft:afterEvents.playerJoin").unsubscribe(onJoin); }) .build() .registerEvent(); function onJoin(event){ joiningPlayers.add(event.playerName); }