Path: blob/master/src/library/classes/playerBuilder.ts
1784 views
import { EntityEquippableComponent, EntityInventoryComponent, Player as MinecraftPlayer, world } from "@minecraft/server";1import { InputButton, ButtonState } from "@minecraft/server";2import { getItemCountReturn } from "../@types/classes/PlayerBuilder.js";3import isWhitelistEnabled from "whitelist.js";45type Player = MinecraftPlayer;67export class PlayerBuilder {8/**9* Tests if the player has the permission for certain actions10* @param {Player} player Player to test for permissions11* @param {string} perm The permission string being tested12* @returns {boolean}13*/14hasPermission(player: Player, perm: string): boolean {15if (!isWhitelistEnabled() || !perm) return true;1617let included = false;18const permLevels = perm.split(".");19for (const tag of player.getTags()) {20const levels = tag.split(".");21let negate = false;22if (levels[0].startsWith("+")) {23negate = false;24levels[0] = levels[0].substring(1);25} else if (levels[0].startsWith("-")) {26negate = true;27levels[0] = levels[0].substring(1);28}2930if (levels.every((level, i) => level == permLevels[i])) {31if (negate) {32return false;33} else {34included = true;35}36}37}3839return included;40}41/**42* Look if player is in the game43* @param {string} player Player you are looking for44* @returns {boolean}45* @example PlayerBuilder.find('notbeer');46*/47find(player: string): boolean {48const players = this.list();49return !!players.find((p) => {50return p.name == player;51});52}53/**54* Get list of players in game55* @returns {Array<string>}56* @example PlayerBuilder.list();57*/58list(): Array<Player> {59return Array.from(world.getPlayers()) as Array<Player>;60}61/**62* Get the player's inventory container63* @param {Player} [player] Player of interest64* @returns {InventoryComponentContainer}65*/66getInventory(player: Player) {67return (player.getComponent("minecraft:inventory") as EntityInventoryComponent).container;68}69/**70* Get the player's equipment component71* @param {Player} [player] Player of interest72* @returns {Minecraft.EntityEquippableComponent}73*/74getEquipment(player: Player) {75return player.getComponent("minecraft:equippable") as EntityEquippableComponent;76}77/**78* Get the amount on a specific items player(s) has79* @param {Player} [player] Player you are searching80* @param {string} itemIdentifier Item you are looking for81* @param {number} [itemData] Item data you are looking for82* @returns {Array<getItemCountReturn>}83*/84getItemCount(player: Player, itemIdentifier: string): Array<getItemCountReturn> {85const itemCount: Array<getItemCountReturn> = [];86const inventory = this.getInventory(player);87for (let slot = 0; slot < inventory.size; slot++) {88const item = inventory.getItem(slot);89if (item?.typeId == itemIdentifier) {90itemCount.push({ count: item.amount, slot });91}92}93return itemCount;94}95/**96* Get the current item in the player's main hand97* @param {Player} [player] Player you are searching98* @returns {?ItemStack}99*/100getHeldItem(player: Player) {101return this.getInventory(player).getItem(player.selectedSlotIndex);102}103104/**105* Check if a player is sneaking (including midair)106* @param {Player} player Player to check107* @returns {boolean}108*/109isSneaking(player: Player): boolean {110return player.isSneaking || (player.inputInfo.getButtonState(InputButton.Sneak) === ButtonState.Pressed && player.isFlying && Math.abs(player.getVelocity().y) < 0.01);111}112}113export const Player = new PlayerBuilder();114115116