teeworlds 2.1.5 → 2.1.9

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/huffman.js ADDED
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var FREQ_TABLE = [
3
+ 1 << 30, 4545, 2657, 431, 1950, 919, 444, 482, 2244, 617, 838, 542, 715, 1814, 304, 240, 754, 212, 647, 186,
4
+ 283, 131, 146, 166, 543, 164, 167, 136, 179, 859, 363, 113, 157, 154, 204, 108, 137, 180, 202, 176,
5
+ 872, 404, 168, 134, 151, 111, 113, 109, 120, 126, 129, 100, 41, 20, 16, 22, 18, 18, 17, 19,
6
+ 16, 37, 13, 21, 362, 166, 99, 78, 95, 88, 81, 70, 83, 284, 91, 187, 77, 68, 52, 68,
7
+ 59, 66, 61, 638, 71, 157, 50, 46, 69, 43, 11, 24, 13, 19, 10, 12, 12, 20, 14, 9,
8
+ 20, 20, 10, 10, 15, 15, 12, 12, 7, 19, 15, 14, 13, 18, 35, 19, 17, 14, 8, 5,
9
+ 15, 17, 9, 15, 14, 18, 8, 10, 2173, 134, 157, 68, 188, 60, 170, 60, 194, 62, 175, 71,
10
+ 148, 67, 167, 78, 211, 67, 156, 69, 1674, 90, 174, 53, 147, 89, 181, 51, 174, 63, 163, 80,
11
+ 167, 94, 128, 122, 223, 153, 218, 77, 200, 110, 190, 73, 174, 69, 145, 66, 277, 143, 141, 60,
12
+ 136, 53, 180, 57, 142, 57, 158, 61, 166, 112, 152, 92, 26, 22, 21, 28, 20, 26, 30, 21,
13
+ 32, 27, 20, 17, 23, 21, 30, 22, 22, 21, 27, 25, 17, 27, 23, 18, 39, 26, 15, 21,
14
+ 12, 18, 18, 27, 20, 18, 15, 19, 11, 17, 33, 12, 18, 15, 19, 18, 16, 26, 17, 18,
15
+ 9, 10, 25, 22, 22, 17, 20, 16, 6, 16, 15, 20, 14, 18, 24, 335, 1517
16
+ ], HUFFMAN_EOF_SYMBOL = 256, HUFFMAN_MAX_SYMBOLS = HUFFMAN_EOF_SYMBOL + 1, HUFFMAN_MAX_NODES = HUFFMAN_MAX_SYMBOLS * 2 - 1, HUFFMAN_LUTBITS = 10, HUFFMAN_LUTSIZE = 1 << HUFFMAN_LUTBITS, HUFFMAN_LUTMASK = HUFFMAN_LUTSIZE - 1;
17
+ var Huffman = /** @class */ (function () {
18
+ function Huffman(frequencies) {
19
+ if (frequencies === void 0) { frequencies = FREQ_TABLE; }
20
+ this.nodes = new Array(HUFFMAN_MAX_NODES);
21
+ for (var i = 0; i < HUFFMAN_MAX_NODES; i++) {
22
+ this.nodes[i] = {};
23
+ }
24
+ this.decode_lut = new Array(HUFFMAN_LUTSIZE);
25
+ this.num_nodes = 0;
26
+ this.start_node_index = 0;
27
+ this.construct_tree(frequencies);
28
+ for (var i = 0; i < HUFFMAN_LUTSIZE; i++) {
29
+ var bits = i;
30
+ var broke = false;
31
+ var index = this.start_node_index;
32
+ for (var x = 0; x < HUFFMAN_LUTBITS; x++) {
33
+ if (bits & 1)
34
+ index = this.nodes[index].right;
35
+ else
36
+ index = this.nodes[index].left;
37
+ bits >>= 1;
38
+ if (this.nodes[index].numbits) {
39
+ this.decode_lut[i] = index;
40
+ broke = true;
41
+ break;
42
+ }
43
+ }
44
+ if (!broke) {
45
+ this.decode_lut[i] = index;
46
+ }
47
+ }
48
+ }
49
+ Huffman.prototype.set_bits_r = function (node_index, bits, depth) {
50
+ if (this.nodes[node_index].right != 0xffff)
51
+ this.set_bits_r(this.nodes[node_index].right, bits | (1 << depth), depth + 1);
52
+ if (this.nodes[node_index].left != 0xffff)
53
+ this.set_bits_r(this.nodes[node_index].left, bits, depth + 1);
54
+ if (this.nodes[node_index].numbits) {
55
+ this.nodes[node_index].bits = bits;
56
+ this.nodes[node_index].numbits = depth;
57
+ }
58
+ };
59
+ Huffman.prototype.bubble_sort = function (index_list, node_list, size) {
60
+ var changed = true;
61
+ while (changed) {
62
+ changed = false;
63
+ for (var i = 0; i < size - 1; i++) {
64
+ if (node_list[index_list[i]].frequency < node_list[index_list[i + 1]].frequency) {
65
+ var temp = index_list[i];
66
+ index_list[i] = index_list[i + 1];
67
+ index_list[i + 1] = temp;
68
+ changed = true;
69
+ }
70
+ }
71
+ size--;
72
+ }
73
+ return index_list;
74
+ };
75
+ Huffman.prototype.construct_tree = function (frequencies) {
76
+ if (frequencies === void 0) { frequencies = FREQ_TABLE; }
77
+ var nodes_left_storage = new Array(HUFFMAN_MAX_SYMBOLS);
78
+ for (var i = 0; i < HUFFMAN_MAX_SYMBOLS; i++) {
79
+ nodes_left_storage[i] = {};
80
+ }
81
+ var nodes_left = new Array(HUFFMAN_MAX_SYMBOLS);
82
+ var num_nodes_left = HUFFMAN_MAX_SYMBOLS;
83
+ for (var i = 0; i < HUFFMAN_MAX_SYMBOLS; i++) {
84
+ this.nodes[i].numbits = 0xFFFFFFFF;
85
+ this.nodes[i].symbol = i;
86
+ this.nodes[i].left = 0xFFFF;
87
+ this.nodes[i].right = 0xFFFF;
88
+ if (i == HUFFMAN_EOF_SYMBOL) {
89
+ nodes_left_storage[i].frequency = 1;
90
+ }
91
+ else
92
+ nodes_left_storage[i].frequency = frequencies[i];
93
+ nodes_left_storage[i].node_id = i;
94
+ nodes_left[i] = i;
95
+ }
96
+ this.num_nodes = HUFFMAN_MAX_SYMBOLS;
97
+ while (num_nodes_left > 1) {
98
+ nodes_left = this.bubble_sort(nodes_left, nodes_left_storage, num_nodes_left);
99
+ this.nodes[this.num_nodes].numbits = 0;
100
+ this.nodes[this.num_nodes].left = nodes_left_storage[nodes_left[num_nodes_left - 1]].node_id;
101
+ this.nodes[this.num_nodes].right = nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id;
102
+ nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id = this.num_nodes;
103
+ nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency = nodes_left_storage[nodes_left[num_nodes_left - 1]].frequency
104
+ + nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency;
105
+ this.num_nodes++;
106
+ num_nodes_left--;
107
+ }
108
+ this.start_node_index = this.num_nodes - 1;
109
+ this.set_bits_r(this.start_node_index, 0, 0);
110
+ };
111
+ Huffman.prototype.compress = function (inp_buffer, start_index, size) {
112
+ if (start_index === void 0) { start_index = 0; }
113
+ if (size === void 0) { size = 0; }
114
+ var output = [];
115
+ var bits = 0;
116
+ var bitcount = 0;
117
+ if (size == 0)
118
+ size = inp_buffer.byteLength;
119
+ inp_buffer = inp_buffer.slice(start_index, start_index + size);
120
+ for (var i = 0; i < size; i++) {
121
+ var x = inp_buffer[i];
122
+ bits |= this.nodes[x].bits << bitcount;
123
+ bitcount += this.nodes[x].numbits;
124
+ while (bitcount >= 8) {
125
+ output.push(bits & 0xff);
126
+ bits >>= 8;
127
+ bitcount -= 8;
128
+ }
129
+ }
130
+ bits |= this.nodes[HUFFMAN_EOF_SYMBOL].bits << bitcount;
131
+ bitcount += this.nodes[HUFFMAN_EOF_SYMBOL].numbits;
132
+ while (bitcount >= 8) {
133
+ output.push(bits & 0xff);
134
+ bits >>= 8;
135
+ bitcount -= 8;
136
+ }
137
+ output.push(bits);
138
+ return Buffer.from(output);
139
+ };
140
+ Huffman.prototype.decompress = function (inp_buffer, size) {
141
+ if (size === void 0) { size = 0; }
142
+ var bits = 0;
143
+ var bitcount = 0;
144
+ var eof = this.nodes[HUFFMAN_EOF_SYMBOL];
145
+ var output = [];
146
+ if (size == 0)
147
+ size = inp_buffer.byteLength;
148
+ inp_buffer = inp_buffer.slice(0, size);
149
+ var src_index = 0;
150
+ while (true) {
151
+ var node_i = -1;
152
+ if (bitcount >= HUFFMAN_LUTBITS)
153
+ node_i = this.decode_lut[bits & HUFFMAN_LUTMASK];
154
+ while (bitcount < 24 && src_index != size) {
155
+ bits |= inp_buffer[src_index] << bitcount;
156
+ bitcount += 8;
157
+ src_index++;
158
+ }
159
+ if (node_i == -1)
160
+ node_i = this.decode_lut[bits & HUFFMAN_LUTMASK];
161
+ if (this.nodes[node_i].numbits) {
162
+ bits >>= this.nodes[node_i].numbits;
163
+ bitcount -= this.nodes[node_i].numbits;
164
+ }
165
+ else {
166
+ bits >>= HUFFMAN_LUTBITS;
167
+ bitcount -= HUFFMAN_LUTBITS;
168
+ while (true) {
169
+ if (bits & 1) {
170
+ node_i = this.nodes[node_i].right;
171
+ }
172
+ else
173
+ node_i = this.nodes[node_i].left;
174
+ bitcount -= 1;
175
+ bits >>= 1;
176
+ if (this.nodes[node_i].numbits)
177
+ break;
178
+ if (bitcount == 0)
179
+ throw new Error("No more bits, decoding error");
180
+ }
181
+ }
182
+ if (this.nodes[node_i] == eof)
183
+ break;
184
+ output.push(this.nodes[node_i].symbol);
185
+ }
186
+ return Buffer.from(output);
187
+ };
188
+ return Huffman;
189
+ }());
190
+ module.exports = Huffman;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ ;
4
+ var Movement = /** @class */ (function () {
5
+ function Movement() {
6
+ this.input = { m_Direction: 0, m_Fire: 0, m_Hook: 0, m_Jump: 0, m_NextWeapon: 0, m_PlayerFlags: 1, m_PrevWeapon: 0, m_TargetX: 0, m_TargetY: 0, m_WantedWeapon: 1 };
7
+ }
8
+ Movement.prototype.RunLeft = function () {
9
+ this.input.m_Direction = -1;
10
+ };
11
+ Movement.prototype.RunRight = function () {
12
+ this.input.m_Direction = 1;
13
+ };
14
+ Movement.prototype.RunStop = function () {
15
+ this.input.m_Direction = 0;
16
+ };
17
+ Movement.prototype.Jump = function (state) {
18
+ if (state === void 0) { state = true; }
19
+ this.input.m_Jump = state ? 1 : 0;
20
+ };
21
+ Movement.prototype.Fire = function () {
22
+ this.input.m_Fire = 1;
23
+ };
24
+ Movement.prototype.Hook = function (state) {
25
+ if (state === void 0) { state = true; }
26
+ this.input.m_Hook = state ? 1 : 0;
27
+ };
28
+ Movement.prototype.NextWeapon = function () {
29
+ this.input.m_NextWeapon = 1;
30
+ this.WantedWeapon(0);
31
+ };
32
+ Movement.prototype.PrevWeapon = function () {
33
+ this.input.m_PrevWeapon = 1;
34
+ this.WantedWeapon(0);
35
+ };
36
+ Movement.prototype.WantedWeapon = function (weapon) {
37
+ this.input.m_WantedWeapon = weapon;
38
+ };
39
+ Movement.prototype.SetAim = function (x, y) {
40
+ this.input.m_TargetX = x;
41
+ this.input.m_TargetY = y;
42
+ };
43
+ Movement.prototype.Reset = function () {
44
+ this.input.m_Direction = 0;
45
+ this.input.m_Jump = 0;
46
+ this.input.m_Fire = 0;
47
+ this.input.m_Hook = 0;
48
+ this.input.m_PlayerFlags = 0;
49
+ this.input.m_NextWeapon = 0;
50
+ this.input.m_PrevWeapon = 0;
51
+ };
52
+ return Movement;
53
+ }());
54
+ exports.default = Movement;
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Snapshot = exports.items = exports.itemAppendix = void 0;
4
+ var MsgUnpacker_1 = require("./MsgUnpacker");
5
+ var decoder = new TextDecoder('utf-8');
6
+ exports.itemAppendix = [
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
+ ];
29
+ var items;
30
+ (function (items) {
31
+ items[items["OBJ_EX"] = 0] = "OBJ_EX";
32
+ items[items["OBJ_PLAYER_INPUT"] = 1] = "OBJ_PLAYER_INPUT";
33
+ items[items["OBJ_PROJECTILE"] = 2] = "OBJ_PROJECTILE";
34
+ items[items["OBJ_LASER"] = 3] = "OBJ_LASER";
35
+ items[items["OBJ_PICKUP"] = 4] = "OBJ_PICKUP";
36
+ items[items["OBJ_FLAG"] = 5] = "OBJ_FLAG";
37
+ items[items["OBJ_GAME_INFO"] = 6] = "OBJ_GAME_INFO";
38
+ items[items["OBJ_GAME_DATA"] = 7] = "OBJ_GAME_DATA";
39
+ items[items["OBJ_CHARACTER_CORE"] = 8] = "OBJ_CHARACTER_CORE";
40
+ items[items["OBJ_CHARACTER"] = 9] = "OBJ_CHARACTER";
41
+ items[items["OBJ_PLAYER_INFO"] = 10] = "OBJ_PLAYER_INFO";
42
+ items[items["OBJ_CLIENT_INFO"] = 11] = "OBJ_CLIENT_INFO";
43
+ items[items["OBJ_SPECTATOR_INFO"] = 12] = "OBJ_SPECTATOR_INFO";
44
+ items[items["EVENT_COMMON"] = 13] = "EVENT_COMMON";
45
+ items[items["EVENT_EXPLOSION"] = 14] = "EVENT_EXPLOSION";
46
+ items[items["EVENT_SPAWN"] = 15] = "EVENT_SPAWN";
47
+ items[items["EVENT_HAMMERHIT"] = 16] = "EVENT_HAMMERHIT";
48
+ items[items["EVENT_DEATH"] = 17] = "EVENT_DEATH";
49
+ items[items["EVENT_SOUND_GLOBAL"] = 18] = "EVENT_SOUND_GLOBAL";
50
+ items[items["EVENT_SOUND_WORLD"] = 19] = "EVENT_SOUND_WORLD";
51
+ items[items["EVENT_DAMAGE_INDICATOR"] = 20] = "EVENT_DAMAGE_INDICATOR";
52
+ })(items = exports.items || (exports.items = {}));
53
+ var Snapshot = /** @class */ (function () {
54
+ function Snapshot() {
55
+ }
56
+ Snapshot.prototype.IntsToStr = function (pInts) {
57
+ var pIntz = [];
58
+ var pStr = '';
59
+ for (var _i = 0, pInts_1 = pInts; _i < pInts_1.length; _i++) {
60
+ var x = pInts_1[_i];
61
+ pStr += String.fromCharCode((((x) >> 24) & 0xff) - 128);
62
+ pIntz.push((((x) >> 24) & 0xff) - 128);
63
+ pStr += String.fromCharCode((((x) >> 16) & 0xff) - 128);
64
+ pIntz.push((((x) >> 16) & 0xff) - 128);
65
+ pStr += String.fromCharCode((((x) >> 8) & 0xff) - 128);
66
+ pIntz.push((((x) >> 8) & 0xff) - 128);
67
+ pStr += String.fromCharCode(((x) & 0xff) - 128);
68
+ pIntz.push(((x) & 0xff) - 128);
69
+ }
70
+ pIntz.splice(-1, 1);
71
+ pStr = decoder.decode(new Uint8Array(pIntz));
72
+ pStr = pStr.replace(/\0.*/g, ''); // Remove content from first null char to end.
73
+ return pStr;
74
+ };
75
+ Snapshot.prototype.parseItem = function (data, Type) {
76
+ var _item = {};
77
+ switch (Type) {
78
+ case items.OBJ_EX:
79
+ break;
80
+ case items.OBJ_PLAYER_INPUT:
81
+ _item = {
82
+ direction: data[0],
83
+ target_x: data[1],
84
+ target_y: data[2],
85
+ jump: data[3],
86
+ fire: data[4],
87
+ hook: data[5],
88
+ player_flags: data[6],
89
+ wanted_weapon: data[7],
90
+ next_weapon: data[8],
91
+ prev_weapon: data[9],
92
+ };
93
+ break;
94
+ case items.OBJ_PROJECTILE:
95
+ _item = {
96
+ x: data[0],
97
+ y: data[1],
98
+ vel_x: data[2],
99
+ vel_y: data[3],
100
+ type_: data[4],
101
+ start_tick: data[5],
102
+ };
103
+ break;
104
+ case items.OBJ_LASER:
105
+ _item = {
106
+ x: data[0],
107
+ y: data[1],
108
+ from_x: data[2],
109
+ from_y: data[3],
110
+ start_tick: data[4],
111
+ };
112
+ break;
113
+ case items.OBJ_PICKUP:
114
+ _item = {
115
+ x: data[0],
116
+ y: data[1],
117
+ type_: data[2],
118
+ subtype: data[3],
119
+ };
120
+ break;
121
+ case items.OBJ_FLAG:
122
+ _item = {
123
+ x: data[0],
124
+ y: data[1],
125
+ team: data[2],
126
+ };
127
+ break;
128
+ case items.OBJ_GAME_INFO:
129
+ _item = {
130
+ game_flags: data[0],
131
+ game_state_flags: data[1],
132
+ round_start_tick: data[2],
133
+ warmup_timer: data[3],
134
+ score_limit: data[4],
135
+ time_limit: data[5],
136
+ round_num: data[6],
137
+ round_current: data[7],
138
+ };
139
+ break;
140
+ case items.OBJ_GAME_DATA:
141
+ _item = {
142
+ teamscore_red: data[0],
143
+ teamscore_blue: data[1],
144
+ flag_carrier_red: data[2],
145
+ flag_carrier_blue: data[3],
146
+ };
147
+ break;
148
+ case items.OBJ_CHARACTER_CORE:
149
+ _item = {
150
+ tick: data[0],
151
+ x: data[1],
152
+ y: data[2],
153
+ vel_x: data[3],
154
+ vel_y: data[4],
155
+ angle: data[5],
156
+ direction: data[6],
157
+ jumped: data[7],
158
+ hooked_player: data[8],
159
+ hook_state: data[9],
160
+ hook_tick: data[10],
161
+ hook_x: data[11],
162
+ hook_y: data[12],
163
+ hook_dx: data[13],
164
+ hook_dy: data[14],
165
+ };
166
+ break;
167
+ case items.OBJ_CHARACTER:
168
+ _item = {
169
+ character_core: {
170
+ tick: data[0],
171
+ x: data[1],
172
+ y: data[2],
173
+ vel_x: data[3],
174
+ vel_y: data[4],
175
+ angle: data[5],
176
+ direction: data[6],
177
+ jumped: data[7],
178
+ hooked_player: data[8],
179
+ hook_state: data[9],
180
+ hook_tick: data[10],
181
+ hook_x: data[11],
182
+ hook_y: data[12],
183
+ hook_dx: data[13],
184
+ hook_dy: data[14],
185
+ },
186
+ player_flags: data[15],
187
+ health: data[16],
188
+ armor: data[17],
189
+ ammo_count: data[18],
190
+ weapon: data[19],
191
+ emote: data[20],
192
+ attack_tick: data[21],
193
+ };
194
+ break;
195
+ case items.OBJ_PLAYER_INFO:
196
+ _item = {
197
+ local: data[0],
198
+ client_id: data[1],
199
+ team: data[2],
200
+ score: data[3],
201
+ latency: data[4],
202
+ };
203
+ break;
204
+ case items.OBJ_CLIENT_INFO:
205
+ _item = {
206
+ name: this.IntsToStr([data[0], data[1], data[2], data[3]]),
207
+ clan: this.IntsToStr([data[4], data[5], data[6]]),
208
+ country: data[7],
209
+ skin: this.IntsToStr([data[8], data[9], data[10], data[11], data[12], data[13]]),
210
+ use_custom_color: Number(data.slice(14, 15)),
211
+ color_body: Number(data.slice(15, 16)),
212
+ color_feet: Number(data.slice(16, 17)),
213
+ };
214
+ break;
215
+ case items.OBJ_SPECTATOR_INFO:
216
+ _item = {
217
+ spectator_id: data[0],
218
+ x: data[1],
219
+ y: data[2],
220
+ };
221
+ break;
222
+ case items.EVENT_COMMON:
223
+ _item = {
224
+ x: data[0],
225
+ y: data[1],
226
+ };
227
+ break;
228
+ case items.EVENT_EXPLOSION:
229
+ _item = {
230
+ common: {
231
+ x: data[0],
232
+ y: data[1]
233
+ }
234
+ };
235
+ break;
236
+ case items.EVENT_SPAWN:
237
+ _item = {
238
+ common: {
239
+ x: data[0],
240
+ y: data[1]
241
+ }
242
+ };
243
+ break;
244
+ case items.EVENT_HAMMERHIT:
245
+ _item = {
246
+ common: {
247
+ x: data[0],
248
+ y: data[1]
249
+ }
250
+ };
251
+ break;
252
+ case items.EVENT_DEATH:
253
+ _item = {
254
+ client_id: data[0],
255
+ common: {
256
+ x: data[1],
257
+ y: data[2]
258
+ }
259
+ };
260
+ break;
261
+ case items.EVENT_SOUND_GLOBAL:
262
+ _item = {
263
+ common: {
264
+ x: data[0],
265
+ y: data[1]
266
+ },
267
+ sound_id: data[2]
268
+ };
269
+ break;
270
+ case items.EVENT_SOUND_WORLD:
271
+ _item = {
272
+ common: {
273
+ x: data[0],
274
+ y: data[1]
275
+ },
276
+ sound_id: data[2]
277
+ };
278
+ break;
279
+ case items.EVENT_DAMAGE_INDICATOR:
280
+ _item = {
281
+ angle: data[0],
282
+ common: {
283
+ x: data[0],
284
+ y: data[1]
285
+ },
286
+ };
287
+ break;
288
+ }
289
+ return _item;
290
+ };
291
+ Snapshot.prototype.unpackSnapshot = function (snap, lost) {
292
+ if (lost === void 0) { lost = 0; }
293
+ var unpacker = new MsgUnpacker_1.MsgUnpacker(snap);
294
+ /* key = (((type_id) << 16) | (id))
295
+ * key_to_id = ((key) & 0xffff)
296
+ * key_to_type_id = ((key >> 16) & 0xffff)
297
+ * https://github.com/heinrich5991/libtw2/blob/master/snapshot/src/
298
+ * https://github.com/heinrich5991/libtw2/blob/master/doc/snapshot.md
299
+ */
300
+ var num_removed_items = unpacker.unpackInt();
301
+ var num_item_deltas = unpacker.unpackInt();
302
+ unpacker.unpackInt(); // _zero padding
303
+ /*snapshot_delta:
304
+ [ 4] num_removed_items
305
+ [ 4] num_item_deltas
306
+ [ 4] _zero
307
+ [*4] removed_item_keys
308
+ [ ] item_deltas
309
+ */
310
+ for (var i = 0; i < num_removed_items; i++) {
311
+ unpacker.unpackInt(); // removed_item_keys
312
+ }
313
+ /*item_delta:
314
+ [ 4] type_id
315
+ [ 4] id
316
+ [ 4] _size
317
+ [*4] data_delta*/
318
+ var items = { items: [], /* client_infos: client_infos, player_infos: player_infos,*/ lost: 0 };
319
+ for (var i = 0; i < num_item_deltas; i++) {
320
+ var type_id = unpacker.unpackInt();
321
+ var id = unpacker.unpackInt();
322
+ var key = (((type_id) << 16) | (id));
323
+ var _size = void 0;
324
+ if (type_id > 0 && type_id < exports.itemAppendix.length) {
325
+ _size = exports.itemAppendix[type_id].size;
326
+ }
327
+ else
328
+ _size = unpacker.unpackInt();
329
+ var data = [];
330
+ for (var j = 0; j < _size; j++) {
331
+ if (unpacker.remaining.length > 0)
332
+ data.push(unpacker.unpackInt());
333
+ }
334
+ var parsed = this.parseItem(data, type_id);
335
+ items.items.push({ data: data, parsed: parsed, type_id: type_id, id: id, key: key });
336
+ }
337
+ return items;
338
+ };
339
+ return Snapshot;
340
+ }());
341
+ exports.Snapshot = Snapshot;
package/lib/snapshot.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { MsgUnpacker } from "./MsgUnpacker";
2
2
  var decoder = new TextDecoder('utf-8');
3
3
 
4
- const itemAppendix: {"type_id": number, "size": number, "name": string}[] = [
4
+ export const itemAppendix: {"type_id": number, "size": number, "name": string}[] = [
5
5
  {"type_id": 0, "size": 0, "name": "obj_ex"},
6
6
  {"type_id": 1, "size": 10, "name": "obj_player_input"},
7
7
  {"type_id": 2, "size": 6, "name": "obj_projectile"},
@@ -24,7 +24,8 @@ const itemAppendix: {"type_id": number, "size": number, "name": string}[] = [
24
24
  {"type_id": 19, "size": 3, "name": "event_sound_world"},
25
25
  {"type_id": 20, "size": 3, "name": "event_damage_indicator"}
26
26
  ]
27
- enum items {
27
+
28
+ export enum items {
28
29
  OBJ_EX,
29
30
  OBJ_PLAYER_INPUT,
30
31
  OBJ_PROJECTILE,
@@ -47,9 +48,10 @@ enum items {
47
48
  EVENT_SOUND_WORLD,
48
49
  EVENT_DAMAGE_INDICATOR
49
50
  }
50
- type Item = PlayerInput | PlayerInfo | Projectile | Laser | Pickup | Flag | GameInfo | GameData | CharacterCore | Character | PlayerInfo | ClientInfo | SpectatorInfo | Common | Explosion | Spawn |HammerHit | Death | SoundGlobal | SoundWorld | DamageInd | DdnetCharacter;
51
51
 
52
- class Snapshot {
52
+ export type Item = PlayerInput | PlayerInfo | Projectile | Laser | Pickup | Flag | GameInfo | GameData | CharacterCore | Character | PlayerInfo | ClientInfo | SpectatorInfo | Common | Explosion | Spawn |HammerHit | Death | SoundGlobal | SoundWorld | DamageInd | DdnetCharacter;
53
+
54
+ export class Snapshot {
53
55
  private IntsToStr(pInts: number[]): string {
54
56
  var pIntz: number[] = [];
55
57
  var pStr = ''
@@ -65,7 +67,8 @@ class Snapshot {
65
67
  }
66
68
  pIntz.splice(-1, 1)
67
69
  pStr = decoder.decode(new Uint8Array(pIntz));
68
- pStr = pStr.replace(/\x00|\u0000/g, "");//.replace(/タ/g, "")
70
+
71
+ pStr = pStr.replace(/\0.*/g, ''); // Remove content from first null char to end.
69
72
  return pStr;
70
73
  }
71
74
  private parseItem(data: number[], Type: number): Item {
@@ -288,10 +291,8 @@ class Snapshot {
288
291
  return _item;
289
292
  }
290
293
  unpackSnapshot(snap: number[], lost = 0) {
291
- // var size = unpackInt(snap).result;
292
294
  let unpacker = new MsgUnpacker(snap);
293
295
 
294
- // snap = unpackInt(snap).remaining; // size
295
296
 
296
297
  /* key = (((type_id) << 16) | (id))
297
298
  * key_to_id = ((key) & 0xffff)
@@ -300,9 +301,6 @@ class Snapshot {
300
301
  * https://github.com/heinrich5991/libtw2/blob/master/doc/snapshot.md
301
302
  */
302
303
 
303
- // snap = unpackInt(snap).remaining;
304
- // console.log(unpackInt(snap).result, "tick?") // key?
305
- // snap = unpackInt(snap).remaining;
306
304
  let num_removed_items = unpacker.unpackInt();
307
305
  let num_item_deltas = unpacker.unpackInt();
308
306
  unpacker.unpackInt(); // _zero padding
@@ -340,16 +338,12 @@ class Snapshot {
340
338
  if (unpacker.remaining.length > 0)
341
339
  data.push(unpacker.unpackInt());
342
340
  }
343
- // console.log(type_id, id, _size, data);
341
+
344
342
  let parsed = this.parseItem(data, type_id)
345
343
 
346
- // console.log(data)
347
- // console.log('')
348
344
  items.items.push({data, parsed, type_id, id, key})
349
345
  }
350
346
 
351
347
 
352
348
  return items;
353
349
  }}
354
- // module.exports = MsgPacker;
355
- export {Snapshot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "teeworlds",
3
- "version": "2.1.5",
3
+ "version": "2.1.9",
4
4
  "description": "Library for (ingame) teeworlds bots.",
5
5
  "license": "MIT",
6
6
  "main": "index.js",