Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sisilicon
GitHub Repository: sisilicon/worldedit-be
Path: blob/master/src/library/classes/playerBuilder.ts
1784 views
1
import { EntityEquippableComponent, EntityInventoryComponent, Player as MinecraftPlayer, world } from "@minecraft/server";
2
import { InputButton, ButtonState } from "@minecraft/server";
3
import { getItemCountReturn } from "../@types/classes/PlayerBuilder.js";
4
import isWhitelistEnabled from "whitelist.js";
5
6
type Player = MinecraftPlayer;
7
8
export class PlayerBuilder {
9
/**
10
* Tests if the player has the permission for certain actions
11
* @param {Player} player Player to test for permissions
12
* @param {string} perm The permission string being tested
13
* @returns {boolean}
14
*/
15
hasPermission(player: Player, perm: string): boolean {
16
if (!isWhitelistEnabled() || !perm) return true;
17
18
let included = false;
19
const permLevels = perm.split(".");
20
for (const tag of player.getTags()) {
21
const levels = tag.split(".");
22
let negate = false;
23
if (levels[0].startsWith("+")) {
24
negate = false;
25
levels[0] = levels[0].substring(1);
26
} else if (levels[0].startsWith("-")) {
27
negate = true;
28
levels[0] = levels[0].substring(1);
29
}
30
31
if (levels.every((level, i) => level == permLevels[i])) {
32
if (negate) {
33
return false;
34
} else {
35
included = true;
36
}
37
}
38
}
39
40
return included;
41
}
42
/**
43
* Look if player is in the game
44
* @param {string} player Player you are looking for
45
* @returns {boolean}
46
* @example PlayerBuilder.find('notbeer');
47
*/
48
find(player: string): boolean {
49
const players = this.list();
50
return !!players.find((p) => {
51
return p.name == player;
52
});
53
}
54
/**
55
* Get list of players in game
56
* @returns {Array<string>}
57
* @example PlayerBuilder.list();
58
*/
59
list(): Array<Player> {
60
return Array.from(world.getPlayers()) as Array<Player>;
61
}
62
/**
63
* Get the player's inventory container
64
* @param {Player} [player] Player of interest
65
* @returns {InventoryComponentContainer}
66
*/
67
getInventory(player: Player) {
68
return (player.getComponent("minecraft:inventory") as EntityInventoryComponent).container;
69
}
70
/**
71
* Get the player's equipment component
72
* @param {Player} [player] Player of interest
73
* @returns {Minecraft.EntityEquippableComponent}
74
*/
75
getEquipment(player: Player) {
76
return player.getComponent("minecraft:equippable") as EntityEquippableComponent;
77
}
78
/**
79
* Get the amount on a specific items player(s) has
80
* @param {Player} [player] Player you are searching
81
* @param {string} itemIdentifier Item you are looking for
82
* @param {number} [itemData] Item data you are looking for
83
* @returns {Array<getItemCountReturn>}
84
*/
85
getItemCount(player: Player, itemIdentifier: string): Array<getItemCountReturn> {
86
const itemCount: Array<getItemCountReturn> = [];
87
const inventory = this.getInventory(player);
88
for (let slot = 0; slot < inventory.size; slot++) {
89
const item = inventory.getItem(slot);
90
if (item?.typeId == itemIdentifier) {
91
itemCount.push({ count: item.amount, slot });
92
}
93
}
94
return itemCount;
95
}
96
/**
97
* Get the current item in the player's main hand
98
* @param {Player} [player] Player you are searching
99
* @returns {?ItemStack}
100
*/
101
getHeldItem(player: Player) {
102
return this.getInventory(player).getItem(player.selectedSlotIndex);
103
}
104
105
/**
106
* Check if a player is sneaking (including midair)
107
* @param {Player} player Player to check
108
* @returns {boolean}
109
*/
110
isSneaking(player: Player): boolean {
111
return player.isSneaking || (player.inputInfo.getButtonState(InputButton.Sneak) === ButtonState.Pressed && player.isFlying && Math.abs(player.getVelocity().y) < 0.01);
112
}
113
}
114
export const Player = new PlayerBuilder();
115
116