teeworlds 2.0.0

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.
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Snapshot = void 0;
4
+ var MsgUnpacker = require('./MsgUnpacker');
5
+ var decoder = new TextDecoder('utf-8');
6
+ var 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 || (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(/\x00|\u0000/g, ""); //.replace(/タ/g, "")
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
+ // var size = MsgUnpacker.unpackInt(snap).result;
293
+ if (lost === void 0) { lost = 0; }
294
+ snap = MsgUnpacker.unpackInt(snap).remaining;
295
+ /* key = (((type_id) << 16) | (id))
296
+ * key_to_id = ((key) & 0xffff)
297
+ * key_to_type_id = ((key >> 16) & 0xffff)
298
+ * https://github.com/heinrich5991/libtw2/blob/master/snapshot/src/
299
+ * https://github.com/heinrich5991/libtw2/blob/master/doc/snapshot.md
300
+ */
301
+ // snap = MsgUnpacker.unpackInt(snap).remaining;
302
+ // console.log(MsgUnpacker.unpackInt(snap).result, "tick?") // key?
303
+ // snap = MsgUnpacker.unpackInt(snap).remaining;
304
+ for (var i = 0; i < (lost); i++)
305
+ snap = MsgUnpacker.unpackInt(snap).remaining;
306
+ // console.log(MsgUnpacker.unpackInt(snap).result, "?") // key?
307
+ // snap = MsgUnpacker.unpackInt(snap).remaining;
308
+ var client_infos = [];
309
+ var player_infos = [];
310
+ var items = { items: [], /* client_infos: client_infos, player_infos: player_infos,*/ lost: 0 };
311
+ while (snap.length != 0) {
312
+ snap = MsgUnpacker.unpackInt(snap).remaining;
313
+ var type_id = MsgUnpacker.unpackInt(snap).result;
314
+ // console.log(type_id, "type_id");
315
+ snap = MsgUnpacker.unpackInt(snap).remaining;
316
+ var id = MsgUnpacker.unpackInt(snap).result;
317
+ // console.log(id, "id");
318
+ var key = (((type_id) << 16) | (id));
319
+ // console.log(key, "key")
320
+ var _size = 0;
321
+ if (itemAppendix[type_id] && type_id > 0) {
322
+ // console.log("_size is not set")
323
+ // type_id is in itemAppendix -> _size is not set!
324
+ _size = itemAppendix[type_id].size;
325
+ }
326
+ else {
327
+ // console.log("_size is set")
328
+ // _size is set.
329
+ snap = MsgUnpacker.unpackInt(snap).remaining;
330
+ _size = (MsgUnpacker.unpackInt(snap).result);
331
+ }
332
+ // console.log(_size, "size!")
333
+ var data = [];
334
+ for (var i = 0; i < _size; i++) {
335
+ snap = MsgUnpacker.unpackInt(snap).remaining;
336
+ data.push(MsgUnpacker.unpackInt(snap).result);
337
+ if (snap.length == 0) {
338
+ items.lost++;
339
+ }
340
+ }
341
+ if (type_id > 0x4000 || type_id == 0) {
342
+ if (_size == 5 && id == 0) {
343
+ // console.log("DdnetCharacter???")
344
+ var Ddnet_Character = {
345
+ flags: data[0],
346
+ freeze_end: data[1],
347
+ jumps: data[2],
348
+ tele_checkpoint: data[3],
349
+ strong_weak_id: data[4]
350
+ // score: (!players[id] == undefined || typeof players[id].score == 'undefined') ? -1 : players[id].score
351
+ };
352
+ // console.log(Ddnet_Character)
353
+ // if (Ddnet_Character.freeze_end > 0 || Ddnet_Character.freeze_end == -1) {// freezed or deepfreezed
354
+ // } // console.log(Ddnet_Character)
355
+ } // else
356
+ // console.log("lolol uuid??", _size, type_id, id, data)
357
+ }
358
+ if (type_id == 11) {
359
+ // obj_client_info!
360
+ var client_info = {
361
+ name: this.IntsToStr(data.slice(0, 4)),
362
+ clan: this.IntsToStr(data.slice(4, 7)),
363
+ country: Number(data.slice(7, 8)),
364
+ skin: this.IntsToStr(data.slice(8, 14)),
365
+ use_custom_color: Number(data.slice(14, 15)),
366
+ color_body: Number(data.slice(15, 16)),
367
+ color_feet: Number(data.slice(16, 17)),
368
+ };
369
+ client_infos[id] = client_info;
370
+ // console.log(client_info.name, client_info.clan, client_info.skin)
371
+ }
372
+ else if (type_id == 10) {
373
+ var player_info = {
374
+ local: Number(data.slice(0, 1)),
375
+ client_id: Number(data.slice(1, 2)),
376
+ team: Number(data.slice(2, 3)),
377
+ score: Number(data.slice(3, 4)),
378
+ latency: Number(data.slice(4, 5))
379
+ };
380
+ player_infos[player_info.client_id] = player_info;
381
+ // players[id].score = player_info.score
382
+ // console.log(player_info, client_infos[player_info.client_id], data)
383
+ }
384
+ // if (type_id == 10 || type_id == 11)
385
+ // console.log(this.parseItem(data, type_id), itemAppendix[type_id].name, type_id)
386
+ var parsed = this.parseItem(data, type_id);
387
+ // console.log(data)
388
+ // console.log('')
389
+ items.items.push({ data: data, parsed: parsed, type_id: type_id, id: id, key: key });
390
+ }
391
+ // items.client_infos = client_infos;
392
+ // items.player_infos = player_infos;
393
+ return items;
394
+ };
395
+ return Snapshot;
396
+ }());
397
+ exports.Snapshot = Snapshot;