teeworlds 2.4.4 → 2.4.7
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/README.md +7 -7
- package/docs/events.md +367 -0
- package/docs/examples/chat_bot.js +25 -0
- package/docs/examples/kill_on_freeze.js +20 -0
- package/index.js +0 -1
- package/index.ts +1 -2
- package/lib/MsgUnpacker.js +6 -0
- package/lib/MsgUnpacker.ts +7 -0
- package/lib/UUIDManager.js +50 -0
- package/lib/UUIDManager.ts +45 -0
- package/lib/client.js +149 -99
- package/lib/client.ts +197 -126
- package/lib/components/game.js +11 -11
- package/lib/components/game.ts +33 -21
- package/lib/{movement.js → components/movement.js} +28 -0
- package/lib/{movement.ts → components/movement.ts} +25 -0
- package/lib/components/snapshot.js +258 -0
- package/lib/components/snapshot.ts +219 -0
- package/lib/snapshot.js +143 -90
- package/lib/snapshot.ts +166 -106
- package/lib/snapshots.d.ts +81 -29
- package/package.json +1 -1
- package/test.js +57 -0
package/lib/snapshot.js
CHANGED
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Snapshot = exports.items = void 0;
|
|
4
|
+
var UUIDManager_1 = require("./UUIDManager");
|
|
4
5
|
var MsgUnpacker_1 = require("./MsgUnpacker");
|
|
5
6
|
var decoder = new TextDecoder('utf-8');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
var ___itemAppendix = [
|
|
8
|
+
{ "type_id": 0, "size": 0, "name": "obj_ex" },
|
|
9
|
+
{ "type_id": 1, "size": 10, "name": "obj_player_input" },
|
|
10
|
+
{ "type_id": 2, "size": 6, "name": "obj_projectile" },
|
|
11
|
+
{ "type_id": 3, "size": 5, "name": "obj_laser" },
|
|
12
|
+
{ "type_id": 4, "size": 4, "name": "obj_pickup" },
|
|
13
|
+
{ "type_id": 5, "size": 3, "name": "obj_flag" },
|
|
14
|
+
{ "type_id": 6, "size": 8, "name": "obj_game_info" },
|
|
15
|
+
{ "type_id": 7, "size": 4, "name": "obj_game_data" },
|
|
16
|
+
{ "type_id": 8, "size": 15, "name": "obj_character_core" },
|
|
17
|
+
{ "type_id": 9, "size": 22, "name": "obj_character" },
|
|
18
|
+
{ "type_id": 10, "size": 5, "name": "obj_player_info" },
|
|
19
|
+
{ "type_id": 11, "size": 17, "name": "obj_client_info" },
|
|
20
|
+
{ "type_id": 12, "size": 3, "name": "obj_spectator_info" },
|
|
21
|
+
{ "type_id": 13, "size": 2, "name": "common" },
|
|
22
|
+
{ "type_id": 14, "size": 2, "name": "explosion" },
|
|
23
|
+
{ "type_id": 15, "size": 2, "name": "spawn" },
|
|
24
|
+
{ "type_id": 16, "size": 2, "name": "hammerhit" },
|
|
25
|
+
{ "type_id": 17, "size": 3, "name": "death" },
|
|
26
|
+
{ "type_id": 18, "size": 3, "name": "sound_global" },
|
|
27
|
+
{ "type_id": 19, "size": 3, "name": "sound_world" },
|
|
28
|
+
{ "type_id": 20, "size": 3, "name": "damage_indicator" } // event_damage_indicator
|
|
29
|
+
];
|
|
29
30
|
var itemAppendix = [
|
|
30
31
|
0,
|
|
31
32
|
10,
|
|
@@ -73,11 +74,22 @@ var items;
|
|
|
73
74
|
items[items["EVENT_SOUND_WORLD"] = 19] = "EVENT_SOUND_WORLD";
|
|
74
75
|
items[items["EVENT_DAMAGE_INDICATOR"] = 20] = "EVENT_DAMAGE_INDICATOR";
|
|
75
76
|
})(items = exports.items || (exports.items = {}));
|
|
77
|
+
// https://github.com/ddnet/ddnet/blob/571b0b36de83d18f2524ee371fc3223d04b94135/datasrc/network.py#L236
|
|
78
|
+
var supported_uuids = [
|
|
79
|
+
"my-own-object@heinrich5991.de",
|
|
80
|
+
"character@netobj.ddnet.tw",
|
|
81
|
+
"player@netobj.ddnet.tw",
|
|
82
|
+
"gameinfo@netobj.ddnet.tw",
|
|
83
|
+
"projectile@netobj.ddnet.tw",
|
|
84
|
+
"laser@netobj.ddnet.tw",
|
|
85
|
+
];
|
|
76
86
|
var Snapshot = /** @class */ (function () {
|
|
77
|
-
function Snapshot() {
|
|
87
|
+
function Snapshot(_client) {
|
|
78
88
|
this.deltas = [];
|
|
79
89
|
this.eSnapHolder = [];
|
|
80
90
|
this.crc_errors = 0;
|
|
91
|
+
this.uuid_manager = new UUIDManager_1.UUIDManager(32767, true); // snapshot max_type
|
|
92
|
+
this.client = _client;
|
|
81
93
|
}
|
|
82
94
|
Snapshot.prototype.IntsToStr = function (pInts) {
|
|
83
95
|
var pIntz = [];
|
|
@@ -99,7 +111,68 @@ var Snapshot = /** @class */ (function () {
|
|
|
99
111
|
return pStr;
|
|
100
112
|
};
|
|
101
113
|
Snapshot.prototype.parseItem = function (data, Type, id) {
|
|
114
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
102
115
|
var _item = {};
|
|
116
|
+
if (Type >= 0x4000) { // offset uuid type
|
|
117
|
+
if (((_a = this.uuid_manager.LookupType(Type)) === null || _a === void 0 ? void 0 : _a.name) == "my-own-object@heinrich5991.de") {
|
|
118
|
+
_item = {
|
|
119
|
+
m_Test: data[0]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
else if (((_b = this.uuid_manager.LookupType(Type)) === null || _b === void 0 ? void 0 : _b.name) == "character@netobj.ddnet.tw") {
|
|
123
|
+
_item = {
|
|
124
|
+
m_Flags: data[0],
|
|
125
|
+
m_FreezeEnd: data[1],
|
|
126
|
+
m_Jumps: data[2],
|
|
127
|
+
m_TeleCheckpoint: data[3],
|
|
128
|
+
m_StrongWeakID: data[4],
|
|
129
|
+
// # New data fields for jump display, freeze bar and ninja bar
|
|
130
|
+
// # Default values indicate that these values should not be used
|
|
131
|
+
m_JumpedTotal: (_c = data[5]) !== null && _c !== void 0 ? _c : null,
|
|
132
|
+
m_NinjaActivationTick: (_d = data[6]) !== null && _d !== void 0 ? _d : null,
|
|
133
|
+
m_FreezeStart: (_e = data[7]) !== null && _e !== void 0 ? _e : null,
|
|
134
|
+
// # New data fields for improved target accuracy
|
|
135
|
+
m_TargetX: (_f = data[8]) !== null && _f !== void 0 ? _f : null,
|
|
136
|
+
m_TargetY: (_g = data[9]) !== null && _g !== void 0 ? _g : null,
|
|
137
|
+
id: id
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
else if (((_h = this.uuid_manager.LookupType(Type)) === null || _h === void 0 ? void 0 : _h.name) == "player@netobj.ddnet.tw") {
|
|
141
|
+
_item = {
|
|
142
|
+
m_Flags: data[0],
|
|
143
|
+
m_AuthLevel: data[1],
|
|
144
|
+
id: id
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
else if (((_j = this.uuid_manager.LookupType(Type)) === null || _j === void 0 ? void 0 : _j.name) == "gameinfo@netobj.ddnet.tw") {
|
|
148
|
+
_item = {
|
|
149
|
+
m_Flags: data[0],
|
|
150
|
+
m_Version: data[1],
|
|
151
|
+
m_Flags2: data[2]
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else if (((_k = this.uuid_manager.LookupType(Type)) === null || _k === void 0 ? void 0 : _k.name) == "projectile@netobj.ddnet.tw") {
|
|
155
|
+
_item = {
|
|
156
|
+
m_X: data[0],
|
|
157
|
+
m_Y: data[1],
|
|
158
|
+
m_Angle: data[2],
|
|
159
|
+
m_Data: data[3],
|
|
160
|
+
m_Type: data[3],
|
|
161
|
+
m_StartTick: data[3]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
else if (((_l = this.uuid_manager.LookupType(Type)) === null || _l === void 0 ? void 0 : _l.name) == "laser@netobj.ddnet.tw") {
|
|
165
|
+
_item = {
|
|
166
|
+
m_ToX: data[0],
|
|
167
|
+
m_ToY: data[1],
|
|
168
|
+
m_FromX: data[2],
|
|
169
|
+
m_FromY: data[3],
|
|
170
|
+
m_Owner: data[3],
|
|
171
|
+
m_Type: data[3]
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return _item;
|
|
175
|
+
}
|
|
103
176
|
switch (Type) {
|
|
104
177
|
case items.OBJ_EX:
|
|
105
178
|
break;
|
|
@@ -216,6 +289,7 @@ var Snapshot = /** @class */ (function () {
|
|
|
216
289
|
weapon: data[19],
|
|
217
290
|
emote: data[20],
|
|
218
291
|
attack_tick: data[21],
|
|
292
|
+
client_id: id
|
|
219
293
|
};
|
|
220
294
|
break;
|
|
221
295
|
case items.OBJ_PLAYER_INFO:
|
|
@@ -341,10 +415,6 @@ var Snapshot = /** @class */ (function () {
|
|
|
341
415
|
deltaSnaps.push(a);
|
|
342
416
|
return a.ack >= deltatick;
|
|
343
417
|
});
|
|
344
|
-
// if (deltatick != -1 && this.eSnapHolder.length == 0) {
|
|
345
|
-
// console.log("no deltatick stored")
|
|
346
|
-
// return {items: [], recvTick: -1}
|
|
347
|
-
// }
|
|
348
418
|
}
|
|
349
419
|
if (snap.length == 0) {
|
|
350
420
|
// empty snap, copy old one into new ack
|
|
@@ -362,6 +432,7 @@ var Snapshot = /** @class */ (function () {
|
|
|
362
432
|
* https://github.com/heinrich5991/libtw2/blob/master/snapshot/src/
|
|
363
433
|
* https://github.com/heinrich5991/libtw2/blob/master/doc/snapshot.md
|
|
364
434
|
*/
|
|
435
|
+
var _events = [];
|
|
365
436
|
var num_removed_items = unpacker.unpackInt();
|
|
366
437
|
var num_item_deltas = unpacker.unpackInt();
|
|
367
438
|
unpacker.unpackInt(); // _zero padding
|
|
@@ -375,11 +446,6 @@ var Snapshot = /** @class */ (function () {
|
|
|
375
446
|
var deleted = [];
|
|
376
447
|
for (var i = 0; i < num_removed_items; i++) {
|
|
377
448
|
var deleted_key = unpacker.unpackInt(); // removed_item_keys
|
|
378
|
-
// let index = this.deltas.map(delta => delta.key).indexOf(deleted_key);
|
|
379
|
-
// let index = this.deltas.findIndex(delta => delta.key === deleted_key);
|
|
380
|
-
// if (index > -1)
|
|
381
|
-
// this.deltas.splice(index, 1);
|
|
382
|
-
// console.log(deleted_key)
|
|
383
449
|
deleted.push(deleted_key);
|
|
384
450
|
}
|
|
385
451
|
/*item_delta:
|
|
@@ -419,25 +485,53 @@ var Snapshot = /** @class */ (function () {
|
|
|
419
485
|
} // else no previous, use new data
|
|
420
486
|
}
|
|
421
487
|
var parsed = void 0;
|
|
422
|
-
if (
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
488
|
+
if (type_id !== 0) {
|
|
489
|
+
if (!changed) {
|
|
490
|
+
var oldDelta = oldDeltas.find(function (delta) { return delta.key == key; });
|
|
491
|
+
if (oldDelta !== undefined && compareArrays(data, oldDelta.data)) {
|
|
492
|
+
parsed = oldDelta.parsed;
|
|
493
|
+
}
|
|
494
|
+
else
|
|
495
|
+
parsed = this_1.parseItem(data, type_id, id);
|
|
426
496
|
}
|
|
427
497
|
else
|
|
428
498
|
parsed = this_1.parseItem(data, type_id, id);
|
|
499
|
+
this_1.eSnapHolder.push({ Snapshot: { Data: data, Key: key }, ack: recvTick });
|
|
500
|
+
this_1.deltas.push({
|
|
501
|
+
data: data,
|
|
502
|
+
key: key,
|
|
503
|
+
id: id,
|
|
504
|
+
type_id: type_id,
|
|
505
|
+
parsed: parsed
|
|
506
|
+
});
|
|
507
|
+
if (type_id >= items.EVENT_COMMON && type_id <= items.EVENT_DAMAGE_INDICATOR) {
|
|
508
|
+
// this.client.SnapshotUnpacker.
|
|
509
|
+
_events.push({ type_id: type_id, parsed: parsed });
|
|
510
|
+
// this.client.SnapshotUnpacker.emit(___itemAppendix[type_id].name, parsed);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
this_1.eSnapHolder.push({ Snapshot: { Data: data, Key: key }, ack: recvTick });
|
|
515
|
+
this_1.deltas.push({
|
|
516
|
+
data: data,
|
|
517
|
+
key: key,
|
|
518
|
+
id: id,
|
|
519
|
+
type_id: type_id,
|
|
520
|
+
parsed: {}
|
|
521
|
+
});
|
|
522
|
+
var test_1 = function (int) { return [(int >> 24) & 0xff, (int >> 16) & 0xff, (int >> 8) & 0xff, (int) & 0xff]; };
|
|
523
|
+
var test2 = function (ints) { return ints.map(function (a) { return test_1(a); }).flat(); };
|
|
524
|
+
var targetUUID_1 = Buffer.from(test2(data));
|
|
525
|
+
if (!this_1.uuid_manager.LookupType(id)) {
|
|
526
|
+
supported_uuids.forEach(function (a, i) {
|
|
527
|
+
var uuid = (0, UUIDManager_1.createTwMD5Hash)(a);
|
|
528
|
+
if (targetUUID_1.compare(uuid) == 0) {
|
|
529
|
+
_this.uuid_manager.RegisterName(a, id);
|
|
530
|
+
supported_uuids.splice(i, 1);
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
}
|
|
429
534
|
}
|
|
430
|
-
else
|
|
431
|
-
parsed = this_1.parseItem(data, type_id, id);
|
|
432
|
-
this_1.eSnapHolder.push({ Snapshot: { Data: data, Key: key }, ack: recvTick });
|
|
433
|
-
// items.items.push({data, type_id, id, key})
|
|
434
|
-
this_1.deltas.push({
|
|
435
|
-
data: data,
|
|
436
|
-
key: key,
|
|
437
|
-
id: id,
|
|
438
|
-
type_id: type_id,
|
|
439
|
-
parsed: parsed
|
|
440
|
-
});
|
|
441
535
|
};
|
|
442
536
|
var this_1 = this;
|
|
443
537
|
for (var i = 0; i < num_item_deltas; i++) {
|
|
@@ -449,20 +543,6 @@ var Snapshot = /** @class */ (function () {
|
|
|
449
543
|
}
|
|
450
544
|
if (this_2.eSnapHolder.findIndex(function (a) { return a.ack == recvTick && a.Snapshot.Key == newSnap.Snapshot.Key; }) === -1) { // ugly copy new snap to eSnapHolder (if it isnt pushed already)
|
|
451
545
|
this_2.eSnapHolder.push({ Snapshot: { Data: newSnap.Snapshot.Data, Key: newSnap.Snapshot.Key }, ack: recvTick });
|
|
452
|
-
// this.deltas.push({})
|
|
453
|
-
// if (deltatick > -1) {
|
|
454
|
-
// let ____index = this.deltas.findIndex(delta => delta.key == newSnap.Snapshot.Key)
|
|
455
|
-
// if (____index > -1) {
|
|
456
|
-
// this.deltas[____index] = {
|
|
457
|
-
// data: newSnap.Snapshot.Data,
|
|
458
|
-
// key: newSnap.Snapshot.Key,
|
|
459
|
-
// id: newSnap.Snapshot.Key & 0xffff,
|
|
460
|
-
// type_id: ((newSnap.Snapshot.Key >> 16) & 0xffff),
|
|
461
|
-
// parsed: this.parseItem(newSnap.Snapshot.Data, ((newSnap.Snapshot.Key >> 16) & 0xffff), ((newSnap.Snapshot.Key) & 0xffff))
|
|
462
|
-
// };
|
|
463
|
-
// continue;
|
|
464
|
-
// }
|
|
465
|
-
// // }
|
|
466
546
|
var oldDelta = oldDeltas.find(function (delta) { return delta.key == newSnap.Snapshot.Key; });
|
|
467
547
|
if (oldDelta !== undefined && compareArrays(newSnap.Snapshot.Data, oldDelta.data)) {
|
|
468
548
|
this_2.deltas.push(oldDelta);
|
|
@@ -479,36 +559,14 @@ var Snapshot = /** @class */ (function () {
|
|
|
479
559
|
}
|
|
480
560
|
};
|
|
481
561
|
var this_2 = this;
|
|
482
|
-
// if (deleted.length) {
|
|
483
|
-
// let _beforeLength = this.eSnapHolder.length;
|
|
484
|
-
// this.eSnapHolder = this.eSnapHolder.filter(snap => !deleted.includes(snap.Snapshot.Key));
|
|
485
|
-
// let _beforeLength = this.eSnapHolder.length;
|
|
486
|
-
// if ((_beforeLength - this.eSnapHolder.length) !== num_removed_items) {
|
|
487
|
-
// console.log("remove!", (_beforeLength - this.eSnapHolder.length) == num_removed_items, (_beforeLength - this.eSnapHolder.length), num_removed_items, WantedCrc)
|
|
488
|
-
// }
|
|
489
|
-
// }
|
|
490
562
|
for (var _i = 0, deltaSnaps_1 = deltaSnaps; _i < deltaSnaps_1.length; _i++) {
|
|
491
563
|
var newSnap = deltaSnaps_1[_i];
|
|
492
564
|
_loop_2(newSnap);
|
|
493
565
|
}
|
|
494
|
-
// if (items.items.length != num_item_deltas)
|
|
495
|
-
// console.log("length", items.items.length, num_item_deltas, items.items.length - num_item_deltas, WantedCrc)
|
|
496
|
-
/* this.deltas = [];
|
|
497
|
-
for (let newSnap of this.eSnapHolder) {
|
|
498
|
-
if (newSnap.ack == recvTick)
|
|
499
|
-
this.deltas.push({
|
|
500
|
-
data: newSnap.Snapshot.Data,
|
|
501
|
-
key: newSnap.Snapshot.Key,
|
|
502
|
-
id: newSnap.Snapshot.Key & 0xffff,
|
|
503
|
-
type_id: ((newSnap.Snapshot.Key >> 16) & 0xffff),
|
|
504
|
-
parsed: this.parseItem(newSnap.Snapshot.Data, ((newSnap.Snapshot.Key >> 16) & 0xffff), ((newSnap.Snapshot.Key) & 0xffff))
|
|
505
|
-
});
|
|
506
|
-
}*/
|
|
507
566
|
var _crc = this.crc();
|
|
508
567
|
if (_crc !== WantedCrc) {
|
|
509
568
|
this.deltas = oldDeltas;
|
|
510
569
|
this.crc_errors++;
|
|
511
|
-
console.log("crc error", _crc, WantedCrc, this.crc_errors);
|
|
512
570
|
if (this.crc_errors > 5) {
|
|
513
571
|
recvTick = -1;
|
|
514
572
|
this.crc_errors = 0;
|
|
@@ -521,11 +579,7 @@ var Snapshot = /** @class */ (function () {
|
|
|
521
579
|
}
|
|
522
580
|
else if (this.crc_errors > 0)
|
|
523
581
|
this.crc_errors--;
|
|
524
|
-
|
|
525
|
-
// if (this.deltas.length !== filterLength) {
|
|
526
|
-
// this.deltas = this.deltas.filter(a => !deleted.includes(a.key))
|
|
527
|
-
// console.log(this.deltas.length, filterLength, this.deltas.length - filterLength, num_item_deltas )
|
|
528
|
-
// }
|
|
582
|
+
_events.forEach(function (a) { return _this.client.SnapshotUnpacker.emit(___itemAppendix[a.type_id].name, a.parsed); });
|
|
529
583
|
return { items: this.deltas, recvTick: recvTick };
|
|
530
584
|
};
|
|
531
585
|
return Snapshot;
|
|
@@ -549,7 +603,6 @@ function UndiffItem(oldItem, newItem) {
|
|
|
549
603
|
out[i] += a;
|
|
550
604
|
}
|
|
551
605
|
else {
|
|
552
|
-
console.log("UNDEFINED UNDEFINED UNDEFINED");
|
|
553
606
|
out[i] = 0;
|
|
554
607
|
}
|
|
555
608
|
});
|