specprotocol 1.4.2 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/block-finder.d.ts +32 -0
- package/dist/block-finder.d.ts.map +1 -0
- package/dist/block-finder.js +67 -0
- package/dist/block-finder.js.map +1 -0
- package/dist/bossbar.d.ts +58 -0
- package/dist/bossbar.d.ts.map +1 -0
- package/dist/bossbar.js +115 -0
- package/dist/bossbar.js.map +1 -0
- package/dist/bot.d.ts +39 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +48 -0
- package/dist/bot.js.map +1 -1
- package/dist/chat.d.ts +57 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +210 -0
- package/dist/chat.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -6
- package/dist/index.js.map +1 -1
- package/dist/inventory.d.ts +98 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +206 -0
- package/dist/inventory.js.map +1 -0
- package/dist/scoreboard.d.ts +66 -0
- package/dist/scoreboard.d.ts.map +1 -0
- package/dist/scoreboard.js +153 -0
- package/dist/scoreboard.js.map +1 -0
- package/dist/tablist.d.ts +56 -0
- package/dist/tablist.d.ts.map +1 -0
- package/dist/tablist.js +91 -0
- package/dist/tablist.js.map +1 -0
- package/dist/weather.d.ts +33 -0
- package/dist/weather.d.ts.map +1 -0
- package/dist/weather.js +74 -0
- package/dist/weather.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Inventory Manager (Core)
|
|
4
|
+
*
|
|
5
|
+
* Tracks the player's inventory: 36 main slots (0-35 = hotbar 0-8 + main 9-35),
|
|
6
|
+
* armor slots (36-39), off-hand (40), and open container slots.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Inventory = void 0;
|
|
10
|
+
const events_js_1 = require("./utils/events.js");
|
|
11
|
+
class Inventory extends events_js_1.TypedEventEmitter {
|
|
12
|
+
/** Player inventory slots: 0-8 hotbar, 9-35 main, 36-39 armor, 40 off-hand, 41-45 crafting */
|
|
13
|
+
slots = new Array(46).fill(null);
|
|
14
|
+
/** Currently open container slots */
|
|
15
|
+
containerSlots = [];
|
|
16
|
+
/** Current held hotbar slot (0-8) */
|
|
17
|
+
_selectedSlot = 0;
|
|
18
|
+
/** Current open window ID */
|
|
19
|
+
_windowId = 0;
|
|
20
|
+
/** State ID for click container packets */
|
|
21
|
+
_stateId = 0;
|
|
22
|
+
/** Carried item (cursor item) */
|
|
23
|
+
_carriedItem = null;
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
}
|
|
27
|
+
// ─── Getters ────────────────────────────
|
|
28
|
+
/** Currently selected hotbar slot (0-8) */
|
|
29
|
+
get selectedSlot() { return this._selectedSlot; }
|
|
30
|
+
set selectedSlot(slot) {
|
|
31
|
+
this._selectedSlot = slot;
|
|
32
|
+
this.emit('heldItemChange', slot);
|
|
33
|
+
}
|
|
34
|
+
/** Current open window ID */
|
|
35
|
+
get windowId() { return this._windowId; }
|
|
36
|
+
/** State ID for container operations */
|
|
37
|
+
get stateId() { return this._stateId; }
|
|
38
|
+
/** Item currently on cursor */
|
|
39
|
+
get carriedItem() { return this._carriedItem; }
|
|
40
|
+
// ─── Slot Access ────────────────────────
|
|
41
|
+
/** Get item in a player inventory slot (0-45) */
|
|
42
|
+
getSlot(slot) {
|
|
43
|
+
if (slot < 0 || slot >= this.slots.length)
|
|
44
|
+
return null;
|
|
45
|
+
return this.slots[slot] ?? null;
|
|
46
|
+
}
|
|
47
|
+
/** Get item in currently held hotbar slot */
|
|
48
|
+
get heldItem() {
|
|
49
|
+
return this.getSlot(this._selectedSlot);
|
|
50
|
+
}
|
|
51
|
+
/** Get hotbar items (slots 0-8) */
|
|
52
|
+
get hotbar() {
|
|
53
|
+
return this.slots.slice(0, 9);
|
|
54
|
+
}
|
|
55
|
+
/** Get main inventory items (slots 9-35) */
|
|
56
|
+
get main() {
|
|
57
|
+
return this.slots.slice(9, 36);
|
|
58
|
+
}
|
|
59
|
+
/** Get armor slots: [helmet, chestplate, leggings, boots] */
|
|
60
|
+
get armor() {
|
|
61
|
+
return this.slots.slice(36, 40);
|
|
62
|
+
}
|
|
63
|
+
/** Get off-hand item (slot 40) */
|
|
64
|
+
get offHand() {
|
|
65
|
+
return this.slots[40] ?? null;
|
|
66
|
+
}
|
|
67
|
+
/** Get helmet (slot 36) */
|
|
68
|
+
get helmet() { return this.slots[36] ?? null; }
|
|
69
|
+
/** Get chestplate (slot 37) */
|
|
70
|
+
get chestplate() { return this.slots[37] ?? null; }
|
|
71
|
+
/** Get leggings (slot 38) */
|
|
72
|
+
get leggings() { return this.slots[38] ?? null; }
|
|
73
|
+
/** Get boots (slot 39) */
|
|
74
|
+
get boots() { return this.slots[39] ?? null; }
|
|
75
|
+
/** Get all non-null items */
|
|
76
|
+
get items() {
|
|
77
|
+
return this.slots.filter(Boolean);
|
|
78
|
+
}
|
|
79
|
+
/** Count of non-empty slots */
|
|
80
|
+
get usedSlots() {
|
|
81
|
+
return this.items.length;
|
|
82
|
+
}
|
|
83
|
+
/** Count of empty slots in main inventory (9-35) + hotbar (0-8) */
|
|
84
|
+
get emptySlots() {
|
|
85
|
+
let count = 0;
|
|
86
|
+
for (let i = 0; i < 36; i++) {
|
|
87
|
+
if (!this.slots[i])
|
|
88
|
+
count++;
|
|
89
|
+
}
|
|
90
|
+
return count;
|
|
91
|
+
}
|
|
92
|
+
/** Find first slot with matching item ID */
|
|
93
|
+
findItem(itemId) {
|
|
94
|
+
for (let i = 0; i < this.slots.length; i++) {
|
|
95
|
+
if (this.slots[i]?.itemId === itemId)
|
|
96
|
+
return i;
|
|
97
|
+
}
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
/** Find all slots with matching item ID */
|
|
101
|
+
findAllItems(itemId) {
|
|
102
|
+
const result = [];
|
|
103
|
+
for (let i = 0; i < this.slots.length; i++) {
|
|
104
|
+
if (this.slots[i]?.itemId === itemId)
|
|
105
|
+
result.push(i);
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/** Count total items of a given ID across all slots */
|
|
110
|
+
countItem(itemId) {
|
|
111
|
+
let count = 0;
|
|
112
|
+
for (const slot of this.slots) {
|
|
113
|
+
if (slot?.itemId === itemId)
|
|
114
|
+
count += slot.count;
|
|
115
|
+
}
|
|
116
|
+
return count;
|
|
117
|
+
}
|
|
118
|
+
// ─── Container Slots ────────────────────
|
|
119
|
+
/** Get item in container slot */
|
|
120
|
+
getContainerSlot(slot) {
|
|
121
|
+
if (slot < 0 || slot >= this.containerSlots.length)
|
|
122
|
+
return null;
|
|
123
|
+
return this.containerSlots[slot] ?? null;
|
|
124
|
+
}
|
|
125
|
+
/** Get all container slots */
|
|
126
|
+
get container() {
|
|
127
|
+
return this.containerSlots;
|
|
128
|
+
}
|
|
129
|
+
// ─── Updates ────────────────────────────
|
|
130
|
+
/** Set a single slot (from server packet) */
|
|
131
|
+
setSlot(windowId, slot, item, stateId) {
|
|
132
|
+
if (stateId !== undefined)
|
|
133
|
+
this._stateId = stateId;
|
|
134
|
+
if (windowId === 0 || windowId === -1) {
|
|
135
|
+
// Player inventory
|
|
136
|
+
if (slot >= 0 && slot < this.slots.length) {
|
|
137
|
+
this.slots[slot] = item;
|
|
138
|
+
this.emit('slotUpdate', slot, item, windowId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Container
|
|
143
|
+
if (slot >= 0 && slot < this.containerSlots.length) {
|
|
144
|
+
this.containerSlots[slot] = item;
|
|
145
|
+
this.emit('slotUpdate', slot, item, windowId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Set all container contents (from server packet) */
|
|
150
|
+
setContainerContent(windowId, items, stateId, carriedItem) {
|
|
151
|
+
this._windowId = windowId;
|
|
152
|
+
this._stateId = stateId;
|
|
153
|
+
this._carriedItem = carriedItem;
|
|
154
|
+
if (windowId === 0) {
|
|
155
|
+
// Player inventory update
|
|
156
|
+
for (let i = 0; i < Math.min(items.length, this.slots.length); i++) {
|
|
157
|
+
this.slots[i] = items[i] ?? null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Container
|
|
162
|
+
this.containerSlots = items;
|
|
163
|
+
}
|
|
164
|
+
this.emit('inventoryUpdate', windowId);
|
|
165
|
+
}
|
|
166
|
+
/** Open a new container window */
|
|
167
|
+
openWindow(windowId, slotCount) {
|
|
168
|
+
this._windowId = windowId;
|
|
169
|
+
this.containerSlots = new Array(slotCount).fill(null);
|
|
170
|
+
}
|
|
171
|
+
/** Close current container */
|
|
172
|
+
closeWindow() {
|
|
173
|
+
this._windowId = 0;
|
|
174
|
+
this.containerSlots = [];
|
|
175
|
+
}
|
|
176
|
+
/** Clear all inventory data */
|
|
177
|
+
clear() {
|
|
178
|
+
this.slots.fill(null);
|
|
179
|
+
this.containerSlots = [];
|
|
180
|
+
this._selectedSlot = 0;
|
|
181
|
+
this._windowId = 0;
|
|
182
|
+
this._stateId = 0;
|
|
183
|
+
this._carriedItem = null;
|
|
184
|
+
}
|
|
185
|
+
// ─── Item Parsing ───────────────────────
|
|
186
|
+
/** Parse an item stack from buffer data */
|
|
187
|
+
static parseItem(reader) {
|
|
188
|
+
const count = reader.readVarInt();
|
|
189
|
+
if (count <= 0)
|
|
190
|
+
return null;
|
|
191
|
+
const itemId = reader.readVarInt();
|
|
192
|
+
const addComponentsCount = reader.readVarInt();
|
|
193
|
+
const removeComponentsCount = reader.readVarInt();
|
|
194
|
+
// Skip component data for now (complex NBT-like structure)
|
|
195
|
+
const rawData = reader.readBytes(reader.remaining);
|
|
196
|
+
return {
|
|
197
|
+
count,
|
|
198
|
+
itemId,
|
|
199
|
+
addComponentsCount,
|
|
200
|
+
removeComponentsCount,
|
|
201
|
+
rawData,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.Inventory = Inventory;
|
|
206
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../src/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoreboard Manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks scoreboard objectives, scores, teams, and display slots.
|
|
5
|
+
*/
|
|
6
|
+
import { TypedEventEmitter } from './utils/events.js';
|
|
7
|
+
export interface ScoreboardObjective {
|
|
8
|
+
name: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
renderType: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ScoreboardScore {
|
|
13
|
+
entityName: string;
|
|
14
|
+
objectiveName: string;
|
|
15
|
+
value: number;
|
|
16
|
+
displayName?: string;
|
|
17
|
+
numberFormat?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ScoreboardTeam {
|
|
20
|
+
name: string;
|
|
21
|
+
displayName: string;
|
|
22
|
+
prefix: string;
|
|
23
|
+
suffix: string;
|
|
24
|
+
friendlyFire: boolean;
|
|
25
|
+
nameTagVisibility: string;
|
|
26
|
+
collisionRule: string;
|
|
27
|
+
color: number;
|
|
28
|
+
members: Set<string>;
|
|
29
|
+
}
|
|
30
|
+
export interface ScoreboardEvents {
|
|
31
|
+
'objectiveAdd': (objective: ScoreboardObjective) => void;
|
|
32
|
+
'objectiveRemove': (name: string) => void;
|
|
33
|
+
'scoreSet': (score: ScoreboardScore) => void;
|
|
34
|
+
'scoreRemove': (entityName: string, objectiveName: string) => void;
|
|
35
|
+
'teamAdd': (team: ScoreboardTeam) => void;
|
|
36
|
+
'teamRemove': (name: string) => void;
|
|
37
|
+
'teamUpdate': (team: ScoreboardTeam) => void;
|
|
38
|
+
}
|
|
39
|
+
export declare class Scoreboard extends TypedEventEmitter<ScoreboardEvents> {
|
|
40
|
+
private objectives;
|
|
41
|
+
private scores;
|
|
42
|
+
private teams;
|
|
43
|
+
private displaySlots;
|
|
44
|
+
constructor();
|
|
45
|
+
addObjective(name: string, displayName: string, renderType?: number): void;
|
|
46
|
+
removeObjective(name: string): void;
|
|
47
|
+
getObjective(name: string): ScoreboardObjective | undefined;
|
|
48
|
+
getAllObjectives(): ScoreboardObjective[];
|
|
49
|
+
setDisplaySlot(slot: number, objectiveName: string): void;
|
|
50
|
+
getDisplaySlot(slot: number): string | undefined;
|
|
51
|
+
/** Get sidebar objective (slot 1) */
|
|
52
|
+
get sidebar(): ScoreboardObjective | undefined;
|
|
53
|
+
setScore(entityName: string, objectiveName: string, value: number, displayName?: string): void;
|
|
54
|
+
removeScore(entityName: string, objectiveName: string): void;
|
|
55
|
+
getScores(objectiveName: string): ScoreboardScore[];
|
|
56
|
+
getScore(entityName: string, objectiveName: string): number | undefined;
|
|
57
|
+
addTeam(name: string, displayName?: string): ScoreboardTeam;
|
|
58
|
+
removeTeam(name: string): void;
|
|
59
|
+
getTeam(name: string): ScoreboardTeam | undefined;
|
|
60
|
+
getTeamByMember(memberName: string): ScoreboardTeam | undefined;
|
|
61
|
+
getAllTeams(): ScoreboardTeam[];
|
|
62
|
+
addTeamMembers(teamName: string, members: string[]): void;
|
|
63
|
+
removeTeamMembers(teamName: string, members: string[]): void;
|
|
64
|
+
clear(): void;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=scoreboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoreboard.d.ts","sourceRoot":"","sources":["../src/scoreboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scoreboard Manager
|
|
4
|
+
*
|
|
5
|
+
* Tracks scoreboard objectives, scores, teams, and display slots.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.Scoreboard = void 0;
|
|
9
|
+
const events_js_1 = require("./utils/events.js");
|
|
10
|
+
class Scoreboard extends events_js_1.TypedEventEmitter {
|
|
11
|
+
objectives = new Map();
|
|
12
|
+
scores = new Map();
|
|
13
|
+
teams = new Map();
|
|
14
|
+
displaySlots = new Map(); // slot → objective name
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
// ─── Objectives ─────────────────────────
|
|
19
|
+
addObjective(name, displayName, renderType = 0) {
|
|
20
|
+
const obj = { name, displayName, renderType };
|
|
21
|
+
this.objectives.set(name, obj);
|
|
22
|
+
this.emit('objectiveAdd', obj);
|
|
23
|
+
}
|
|
24
|
+
removeObjective(name) {
|
|
25
|
+
this.objectives.delete(name);
|
|
26
|
+
// Remove all scores for this objective
|
|
27
|
+
for (const [entity, entityScores] of this.scores) {
|
|
28
|
+
const filtered = entityScores.filter(s => s.objectiveName !== name);
|
|
29
|
+
if (filtered.length === 0)
|
|
30
|
+
this.scores.delete(entity);
|
|
31
|
+
else
|
|
32
|
+
this.scores.set(entity, filtered);
|
|
33
|
+
}
|
|
34
|
+
this.emit('objectiveRemove', name);
|
|
35
|
+
}
|
|
36
|
+
getObjective(name) {
|
|
37
|
+
return this.objectives.get(name);
|
|
38
|
+
}
|
|
39
|
+
getAllObjectives() {
|
|
40
|
+
return Array.from(this.objectives.values());
|
|
41
|
+
}
|
|
42
|
+
// ─── Display Slots ──────────────────────
|
|
43
|
+
setDisplaySlot(slot, objectiveName) {
|
|
44
|
+
this.displaySlots.set(slot, objectiveName);
|
|
45
|
+
}
|
|
46
|
+
getDisplaySlot(slot) {
|
|
47
|
+
return this.displaySlots.get(slot);
|
|
48
|
+
}
|
|
49
|
+
/** Get sidebar objective (slot 1) */
|
|
50
|
+
get sidebar() {
|
|
51
|
+
const name = this.displaySlots.get(1);
|
|
52
|
+
return name ? this.objectives.get(name) : undefined;
|
|
53
|
+
}
|
|
54
|
+
// ─── Scores ─────────────────────────────
|
|
55
|
+
setScore(entityName, objectiveName, value, displayName) {
|
|
56
|
+
const score = { entityName, objectiveName, value, displayName };
|
|
57
|
+
let entityScores = this.scores.get(entityName);
|
|
58
|
+
if (!entityScores) {
|
|
59
|
+
entityScores = [];
|
|
60
|
+
this.scores.set(entityName, entityScores);
|
|
61
|
+
}
|
|
62
|
+
const idx = entityScores.findIndex(s => s.objectiveName === objectiveName);
|
|
63
|
+
if (idx >= 0)
|
|
64
|
+
entityScores[idx] = score;
|
|
65
|
+
else
|
|
66
|
+
entityScores.push(score);
|
|
67
|
+
this.emit('scoreSet', score);
|
|
68
|
+
}
|
|
69
|
+
removeScore(entityName, objectiveName) {
|
|
70
|
+
const entityScores = this.scores.get(entityName);
|
|
71
|
+
if (entityScores) {
|
|
72
|
+
const idx = entityScores.findIndex(s => s.objectiveName === objectiveName);
|
|
73
|
+
if (idx >= 0)
|
|
74
|
+
entityScores.splice(idx, 1);
|
|
75
|
+
if (entityScores.length === 0)
|
|
76
|
+
this.scores.delete(entityName);
|
|
77
|
+
}
|
|
78
|
+
this.emit('scoreRemove', entityName, objectiveName);
|
|
79
|
+
}
|
|
80
|
+
getScores(objectiveName) {
|
|
81
|
+
const result = [];
|
|
82
|
+
for (const scores of this.scores.values()) {
|
|
83
|
+
for (const score of scores) {
|
|
84
|
+
if (score.objectiveName === objectiveName)
|
|
85
|
+
result.push(score);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result.sort((a, b) => b.value - a.value);
|
|
89
|
+
}
|
|
90
|
+
getScore(entityName, objectiveName) {
|
|
91
|
+
const scores = this.scores.get(entityName);
|
|
92
|
+
return scores?.find(s => s.objectiveName === objectiveName)?.value;
|
|
93
|
+
}
|
|
94
|
+
// ─── Teams ──────────────────────────────
|
|
95
|
+
addTeam(name, displayName = name) {
|
|
96
|
+
const team = {
|
|
97
|
+
name,
|
|
98
|
+
displayName,
|
|
99
|
+
prefix: '',
|
|
100
|
+
suffix: '',
|
|
101
|
+
friendlyFire: true,
|
|
102
|
+
nameTagVisibility: 'always',
|
|
103
|
+
collisionRule: 'always',
|
|
104
|
+
color: 15, // white
|
|
105
|
+
members: new Set(),
|
|
106
|
+
};
|
|
107
|
+
this.teams.set(name, team);
|
|
108
|
+
this.emit('teamAdd', team);
|
|
109
|
+
return team;
|
|
110
|
+
}
|
|
111
|
+
removeTeam(name) {
|
|
112
|
+
this.teams.delete(name);
|
|
113
|
+
this.emit('teamRemove', name);
|
|
114
|
+
}
|
|
115
|
+
getTeam(name) {
|
|
116
|
+
return this.teams.get(name);
|
|
117
|
+
}
|
|
118
|
+
getTeamByMember(memberName) {
|
|
119
|
+
for (const team of this.teams.values()) {
|
|
120
|
+
if (team.members.has(memberName))
|
|
121
|
+
return team;
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
getAllTeams() {
|
|
126
|
+
return Array.from(this.teams.values());
|
|
127
|
+
}
|
|
128
|
+
addTeamMembers(teamName, members) {
|
|
129
|
+
const team = this.teams.get(teamName);
|
|
130
|
+
if (!team)
|
|
131
|
+
return;
|
|
132
|
+
for (const m of members)
|
|
133
|
+
team.members.add(m);
|
|
134
|
+
this.emit('teamUpdate', team);
|
|
135
|
+
}
|
|
136
|
+
removeTeamMembers(teamName, members) {
|
|
137
|
+
const team = this.teams.get(teamName);
|
|
138
|
+
if (!team)
|
|
139
|
+
return;
|
|
140
|
+
for (const m of members)
|
|
141
|
+
team.members.delete(m);
|
|
142
|
+
this.emit('teamUpdate', team);
|
|
143
|
+
}
|
|
144
|
+
// ─── Clear ──────────────────────────────
|
|
145
|
+
clear() {
|
|
146
|
+
this.objectives.clear();
|
|
147
|
+
this.scores.clear();
|
|
148
|
+
this.teams.clear();
|
|
149
|
+
this.displaySlots.clear();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.Scoreboard = Scoreboard;
|
|
153
|
+
//# sourceMappingURL=scoreboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoreboard.js","sourceRoot":"","sources":["../src/scoreboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab List / Player List Manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks all players on the server with their info:
|
|
5
|
+
* username, UUID, gamemode, ping, display name, skin textures.
|
|
6
|
+
*/
|
|
7
|
+
import { TypedEventEmitter } from './utils/events.js';
|
|
8
|
+
export interface TabListPlayer {
|
|
9
|
+
uuid: string;
|
|
10
|
+
username: string;
|
|
11
|
+
displayName?: string;
|
|
12
|
+
gameMode: number;
|
|
13
|
+
ping: number;
|
|
14
|
+
listed: boolean;
|
|
15
|
+
properties: Array<{
|
|
16
|
+
name: string;
|
|
17
|
+
value: string;
|
|
18
|
+
signature?: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface TabListEvents {
|
|
22
|
+
'playerJoin': (player: TabListPlayer) => void;
|
|
23
|
+
'playerLeave': (player: TabListPlayer) => void;
|
|
24
|
+
'playerUpdate': (player: TabListPlayer) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare class TabList extends TypedEventEmitter<TabListEvents> {
|
|
27
|
+
private players;
|
|
28
|
+
private _header;
|
|
29
|
+
private _footer;
|
|
30
|
+
constructor();
|
|
31
|
+
/** Get header text */
|
|
32
|
+
get header(): string;
|
|
33
|
+
set header(value: string);
|
|
34
|
+
/** Get footer text */
|
|
35
|
+
get footer(): string;
|
|
36
|
+
set footer(value: string);
|
|
37
|
+
/** Get a player by UUID */
|
|
38
|
+
getPlayer(uuid: string): TabListPlayer | undefined;
|
|
39
|
+
/** Get a player by username */
|
|
40
|
+
getPlayerByName(username: string): TabListPlayer | undefined;
|
|
41
|
+
/** Get all players */
|
|
42
|
+
getAll(): TabListPlayer[];
|
|
43
|
+
/** Get all listed (visible) players */
|
|
44
|
+
getListed(): TabListPlayer[];
|
|
45
|
+
/** Number of players */
|
|
46
|
+
get count(): number;
|
|
47
|
+
/** Add or update a player */
|
|
48
|
+
addPlayer(uuid: string, data: Partial<TabListPlayer>): void;
|
|
49
|
+
/** Update player info */
|
|
50
|
+
updatePlayer(uuid: string, data: Partial<TabListPlayer>): void;
|
|
51
|
+
/** Remove a player */
|
|
52
|
+
removePlayer(uuid: string): void;
|
|
53
|
+
/** Clear all players */
|
|
54
|
+
clear(): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tablist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tablist.d.ts","sourceRoot":"","sources":["../src/tablist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,aAAa;IAC1B,YAAY,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,aAAa,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD;AAED,qBAAa,OAAQ,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACzD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAc;;IAM7B,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAAyB;IAC7C,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAA2B;IAEnD,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAAyB;IAC7C,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAA2B;IAEnD,2BAA2B;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIlD,+BAA+B;IAC/B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAO5D,sBAAsB;IACtB,MAAM,IAAI,aAAa,EAAE;IAIzB,uCAAuC;IACvC,SAAS,IAAI,aAAa,EAAE;IAI5B,wBAAwB;IACxB,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,6BAA6B;IAC7B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAoB3D,yBAAyB;IACzB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAO9D,sBAAsB;IACtB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhC,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAGhB"}
|
package/dist/tablist.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tab List / Player List Manager
|
|
4
|
+
*
|
|
5
|
+
* Tracks all players on the server with their info:
|
|
6
|
+
* username, UUID, gamemode, ping, display name, skin textures.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TabList = void 0;
|
|
10
|
+
const events_js_1 = require("./utils/events.js");
|
|
11
|
+
class TabList extends events_js_1.TypedEventEmitter {
|
|
12
|
+
players = new Map();
|
|
13
|
+
_header = '';
|
|
14
|
+
_footer = '';
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
}
|
|
18
|
+
/** Get header text */
|
|
19
|
+
get header() { return this._header; }
|
|
20
|
+
set header(value) { this._header = value; }
|
|
21
|
+
/** Get footer text */
|
|
22
|
+
get footer() { return this._footer; }
|
|
23
|
+
set footer(value) { this._footer = value; }
|
|
24
|
+
/** Get a player by UUID */
|
|
25
|
+
getPlayer(uuid) {
|
|
26
|
+
return this.players.get(uuid);
|
|
27
|
+
}
|
|
28
|
+
/** Get a player by username */
|
|
29
|
+
getPlayerByName(username) {
|
|
30
|
+
for (const player of this.players.values()) {
|
|
31
|
+
if (player.username === username)
|
|
32
|
+
return player;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Get all players */
|
|
37
|
+
getAll() {
|
|
38
|
+
return Array.from(this.players.values());
|
|
39
|
+
}
|
|
40
|
+
/** Get all listed (visible) players */
|
|
41
|
+
getListed() {
|
|
42
|
+
return this.getAll().filter(p => p.listed);
|
|
43
|
+
}
|
|
44
|
+
/** Number of players */
|
|
45
|
+
get count() {
|
|
46
|
+
return this.players.size;
|
|
47
|
+
}
|
|
48
|
+
/** Add or update a player */
|
|
49
|
+
addPlayer(uuid, data) {
|
|
50
|
+
const existing = this.players.get(uuid);
|
|
51
|
+
if (existing) {
|
|
52
|
+
Object.assign(existing, data);
|
|
53
|
+
this.emit('playerUpdate', existing);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const player = {
|
|
57
|
+
uuid,
|
|
58
|
+
username: data.username ?? 'Unknown',
|
|
59
|
+
displayName: data.displayName,
|
|
60
|
+
gameMode: data.gameMode ?? 0,
|
|
61
|
+
ping: data.ping ?? 0,
|
|
62
|
+
listed: data.listed ?? true,
|
|
63
|
+
properties: data.properties ?? [],
|
|
64
|
+
};
|
|
65
|
+
this.players.set(uuid, player);
|
|
66
|
+
this.emit('playerJoin', player);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Update player info */
|
|
70
|
+
updatePlayer(uuid, data) {
|
|
71
|
+
const player = this.players.get(uuid);
|
|
72
|
+
if (!player)
|
|
73
|
+
return;
|
|
74
|
+
Object.assign(player, data);
|
|
75
|
+
this.emit('playerUpdate', player);
|
|
76
|
+
}
|
|
77
|
+
/** Remove a player */
|
|
78
|
+
removePlayer(uuid) {
|
|
79
|
+
const player = this.players.get(uuid);
|
|
80
|
+
if (player) {
|
|
81
|
+
this.players.delete(uuid);
|
|
82
|
+
this.emit('playerLeave', player);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Clear all players */
|
|
86
|
+
clear() {
|
|
87
|
+
this.players.clear();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.TabList = TabList;
|
|
91
|
+
//# sourceMappingURL=tablist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tablist.js","sourceRoot":"","sources":["../src/tablist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weather Manager (Core)
|
|
3
|
+
*
|
|
4
|
+
* Tracks weather state: clear, rain, thunder.
|
|
5
|
+
*/
|
|
6
|
+
import { TypedEventEmitter } from './utils/events.js';
|
|
7
|
+
export interface WeatherEvents {
|
|
8
|
+
'rain': (isRaining: boolean) => void;
|
|
9
|
+
'thundering': (isThundering: boolean) => void;
|
|
10
|
+
'weatherChange': (weather: WeatherState) => void;
|
|
11
|
+
}
|
|
12
|
+
export type WeatherState = 'clear' | 'rain' | 'thunder';
|
|
13
|
+
export declare class Weather extends TypedEventEmitter<WeatherEvents> {
|
|
14
|
+
private _isRaining;
|
|
15
|
+
private _rainLevel;
|
|
16
|
+
private _thunderLevel;
|
|
17
|
+
constructor();
|
|
18
|
+
/** Whether it's currently raining */
|
|
19
|
+
get isRaining(): boolean;
|
|
20
|
+
/** Whether it's currently thundering */
|
|
21
|
+
get isThundering(): boolean;
|
|
22
|
+
/** Rain intensity (0.0 to 1.0) */
|
|
23
|
+
get rainLevel(): number;
|
|
24
|
+
/** Thunder intensity (0.0 to 1.0) */
|
|
25
|
+
get thunderLevel(): number;
|
|
26
|
+
/** Current weather state */
|
|
27
|
+
get state(): WeatherState;
|
|
28
|
+
/** Handle game event for weather */
|
|
29
|
+
handleGameEvent(event: number, value: number): void;
|
|
30
|
+
/** Clear weather state */
|
|
31
|
+
clear(): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=weather.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../src/weather.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD,qBAAa,OAAQ,SAAQ,iBAAiB,CAAC,aAAa,CAAC;IACzD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;;IAMlC,qCAAqC;IACrC,IAAI,SAAS,IAAI,OAAO,CAA4B;IAEpD,wCAAwC;IACxC,IAAI,YAAY,IAAI,OAAO,CAAmC;IAE9D,kCAAkC;IAClC,IAAI,SAAS,IAAI,MAAM,CAA4B;IAEnD,qCAAqC;IACrC,IAAI,YAAY,IAAI,MAAM,CAA+B;IAEzD,4BAA4B;IAC5B,IAAI,KAAK,IAAI,YAAY,CAIxB;IAED,oCAAoC;IACpC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiCnD,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAKhB"}
|