yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
96 lines (95 loc) • 3.49 kB
JavaScript
import { Minecraft, VanillaWorld, StatusCode } from "../../basis.js";
import { dealWithCmd } from "../../commandutils.js";
import { Command } from "../../command.js";
import { copyPropertiesWithoutOverride } from "../../lib/ObjectUtils.js";
import { getNumber } from "../../lib/getNumber.js";
import { Entity } from "./Entity.js";
import { EntityUtils } from "../../EntityUtils.js";
import { EntityWraps } from "./EntityWraps.js";
class Player extends Entity {
get vanillaPlayer() {
return this.vanillaEntity;
}
get entityType() {
return Minecraft.EntityTypes.get("player");
}
get [Symbol.toStringTag]() {
if (this instanceof Player)
return `Player: { type: ${this.vanillaPlayer.typeId}, name: ${this.vanillaPlayer.name} }`;
return "Object (Player)";
}
/**
* 玩家的经验等级。
* @type {number}
*/
get experienceLevel() {
return this.vanillaPlayer.level;
}
getItemInMainHand() {
return EntityUtils.getItemInMainHand(this.vanillaPlayer);
}
setItemInMainHand(item) {
return EntityUtils.setItemInMainHand(this.vanillaPlayer, item);
}
/**
* 设置玩家的经验等级。
* @param {number} level
*/
setExperienceLevel(level) {
level = getNumber(level);
if (this.vanillaPlayer.level !== level)
this.addLevels(level - this.experienceLevel);
}
/**
* 使玩家离开游戏,玩家将会看到他被服务器踢出游戏。
* @param {string} [msg] - 踢出玩家时显示的消息。
* @throws 若未能成功将玩家踢出游戏,抛出错误。
*/
async kick(msg) {
let rt = null;
if (msg)
rt = await Command.addParams(Command.PRIORITY_HIGHEST, "kick", this.name, msg);
else
rt = await Command.addParams(Command.PRIORITY_HIGHEST, "kick", this.name);
if (rt?.statusCode !== StatusCode.success) {
throw new Error(rt.statusMessage);
}
}
sendChatMessage(msg) {
let rawtext = JSON.stringify({ rawtext: [{ text: msg }] }, dealWithCmd);
Command.addExecute(Command.PRIORITY_HIGH, this.vanillaPlayer, `tellraw ${rawtext}`);
}
get gamemode() {
// @ts-ignore
for (let gm of Object.getOwnPropertyNames(Minecraft.GameMode).map(k => Minecraft.GameMode[k])) {
for (let splayer of VanillaWorld.getPlayers({ gameMode: gm })) {
if (EntityUtils.isSameEntity(splayer, this)) {
return gm;
}
}
}
throw new Error("unknown gamemode");
}
setGamemode(gamemode) {
let command = `gamemode ${gamemode} `;
Command.addExecute(Command.PRIORITY_HIGHEST, this, command);
}
removeXp(xpCount) {
if (this.xpEarnedAtCurrentLevel >= xpCount) {
this.addExperience(-xpCount);
return;
}
let v0 = this.xpEarnedAtCurrentLevel;
xpCount -= v0;
this.addExperience(-v0);
while (xpCount > 0 && this.vanillaPlayer.level > 0) {
this.addLevels(-1);
xpCount -= this.totalXpNeededForNextLevel;
}
if (xpCount < 0)
this.addExperience(xpCount);
}
}
copyPropertiesWithoutOverride(Player.prototype, Minecraft.Player.prototype, "vanillaEntity", ["level"]);
EntityWraps.registerWrap(Player, Minecraft.Player);
export { Player, Player as YoniPlayer };