yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
134 lines (108 loc) • 4.08 kB
text/typescript
import { PlayerGameModeValue } from "../../player/PlayerGameModeValue.js";
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(): Minecraft.Player {
return this.vanillaEntity as unknown as Minecraft.Player;
}
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(): Minecraft.ItemStack | undefined {
return EntityUtils.getItemInMainHand(this.vanillaPlayer);
}
setItemInMainHand(item?: Minecraft.ItemStack): void {
return EntityUtils.setItemInMainHand(this.vanillaPlayer, item);
}
/**
* 设置玩家的经验等级。
* @param {number} level
*/
setExperienceLevel(level: number){
level = getNumber(level);
if (this.vanillaPlayer.level !== level)
this.addLevels(level - this.experienceLevel);
}
/**
* 使玩家离开游戏,玩家将会看到他被服务器踢出游戏。
* @param {string} [msg] - 踢出玩家时显示的消息。
* @throws 若未能成功将玩家踢出游戏,抛出错误。
*/
async kick(msg?: string){
let rt: any = 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: string){
let rawtext = JSON.stringify({rawtext:[{text: msg}]}, dealWithCmd);
Command.addExecute(Command.PRIORITY_HIGH, this.vanillaPlayer, `tellraw @s ${rawtext}`);
}
get gamemode(): Minecraft.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: PlayerGameModeValue){
let command = `gamemode ${gamemode as {}} @s`;
Command.addExecute(Command.PRIORITY_HIGHEST, this, command);
}
removeXp(xpCount: number){
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);
type RemovedKeys = "level"
type OverridedKeys = never
type BaseVanillaPlayerClass =
Omit<
Omit<Minecraft.Player, keyof Minecraft.Entity>,
RemovedKeys | OverridedKeys
>;
interface Player extends BaseVanillaPlayerClass {
}
export { Player, Player as YoniPlayer };