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/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
- // export const itemAppendix: {"type_id": number, "size": number, "name": string}[] = [
7
- // {"type_id": 0, "size": 0, "name": "obj_ex"},
8
- // {"type_id": 1, "size": 10, "name": "obj_player_input"},
9
- // {"type_id": 2, "size": 6, "name": "obj_projectile"},
10
- // {"type_id": 3, "size": 5, "name": "obj_laser"},
11
- // {"type_id": 4, "size": 4, "name": "obj_pickup"},
12
- // {"type_id": 5, "size": 3, "name": "obj_flag"},
13
- // {"type_id": 6, "size": 8, "name": "obj_game_info"},
14
- // {"type_id": 7, "size": 4, "name": "obj_game_data"},
15
- // {"type_id": 8, "size": 15, "name": "obj_character_core"},
16
- // {"type_id": 9, "size": 22, "name": "obj_character"},
17
- // {"type_id": 10, "size": 5, "name": "obj_player_info"},
18
- // {"type_id": 11, "size": 17, "name": "obj_client_info"},
19
- // {"type_id": 12, "size": 3, "name": "obj_spectator_info"},
20
- // {"type_id": 13, "size": 2, "name": "event_common"},
21
- // {"type_id": 14, "size": 2, "name": "event_explosion"},
22
- // {"type_id": 15, "size": 2, "name": "event_spawn"},
23
- // {"type_id": 16, "size": 2, "name": "event_hammerhit"},
24
- // {"type_id": 17, "size": 3, "name": "event_death"},
25
- // {"type_id": 18, "size": 3, "name": "event_sound_global"},
26
- // {"type_id": 19, "size": 3, "name": "event_sound_world"},
27
- // {"type_id": 20, "size": 3, "name": "event_damage_indicator"}
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 (!changed) {
423
- var oldDelta = oldDeltas.find(function (delta) { return delta.key == key; });
424
- if (oldDelta !== undefined && compareArrays(data, oldDelta.data)) {
425
- parsed = oldDelta.parsed;
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
- // let filterLength = this.eSnapHolder.filter(a => a.ack == recvTick).length
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
  });