Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sisilicon
GitHub Repository: sisilicon/worldedit-be
Path: blob/master/src/index.ts
1780 views
1
import { Player, world } from "@minecraft/server";
2
import { print } from "server/util.js";
3
import isWhitelistEnabled from "whitelist.js";
4
import config from "config.js";
5
6
import { contentLog, Server, configuration } from "@notbeer-api";
7
import { getSession, removeSession } from "server/sessions.js";
8
import { PlayerUtil } from "server/modules/player_util.js";
9
10
import "server/commands/command_list.js";
11
import "server/tools/tool_list.js";
12
import "server/ui/index.js";
13
14
Server.setMaxListeners(256);
15
configuration.multiThreadingTimeBudget = config.asyncTimeBudget;
16
const activeBuilders: Player[] = [];
17
18
let ready = false;
19
Server.on("ready", (ev) => {
20
contentLog.debug(`World has been loaded in ${ev.loadTime} ticks!`);
21
ready = true;
22
});
23
24
Server.on("playerLoaded", (ev) => {
25
contentLog.debug(`player ${ev.player.name} loaded.`);
26
if (ready) makeBuilder(ev.player);
27
});
28
29
Server.on("playerLeave", (ev) => {
30
contentLog.debug(`player ${ev.playerName} left.`);
31
removeBuilder(ev.playerId);
32
});
33
34
Server.on("tick", () => {
35
if (!ready) return;
36
37
const realPlayers = world.getPlayers().filter((p) => p != undefined);
38
for (const player of realPlayers) {
39
if (!activeBuilders.includes(player)) {
40
if (PlayerUtil.isHotbarStashed(player)) {
41
PlayerUtil.restoreHotbar(player);
42
}
43
if (makeBuilder(player)) {
44
// Attempt to make them a builder.
45
print("worldedit.permission.granted", player);
46
continue;
47
}
48
}
49
}
50
51
for (let i = activeBuilders.length - 1; i >= 0; i--) {
52
try {
53
// Just testing
54
// eslint-disable-next-line @typescript-eslint/no-unused-vars
55
const name = activeBuilders[i].name;
56
} catch {
57
contentLog.debug("A builder no longer exists!");
58
activeBuilders.splice(i, 1);
59
continue;
60
}
61
62
const builder = activeBuilders[i];
63
if (hasWorldEdit(builder)) {
64
getSession(builder);
65
} else {
66
removeBuilder(builder.id);
67
contentLog.log(`${builder.name} has been revoked of their worldedit permissions.`);
68
print("worldedit.permission.revoked", builder);
69
}
70
}
71
});
72
73
function makeBuilder(player: Player) {
74
if (hasWorldEdit(player) && !activeBuilders.includes(player)) {
75
getSession(player);
76
activeBuilders.push(player);
77
contentLog.log(`${player.name} has been given worldedit permissions.`);
78
return true;
79
}
80
return false;
81
}
82
83
function removeBuilder(player: string) {
84
let i = -1;
85
do {
86
i = activeBuilders.findIndex((p) => {
87
try {
88
return p.id == player;
89
} catch (e) {
90
return true;
91
}
92
});
93
if (i != -1) activeBuilders.splice(i, 1);
94
} while (i != -1);
95
96
removeSession(player);
97
contentLog.debug("Removed player from world edit!");
98
}
99
100
function hasWorldEdit(player: Player) {
101
if (!isWhitelistEnabled()) return true;
102
for (const tag of player.getTags()) {
103
if (tag.startsWith("worldedit")) return true;
104
}
105
return false;
106
}
107
108