teeworlds 2.1.5 → 2.1.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.
@@ -0,0 +1,351 @@
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(/\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
+ if (lost === void 0) { lost = 0; }
293
+ // var size = unpackInt(snap).result;
294
+ var unpacker = new MsgUnpacker_1.MsgUnpacker(snap);
295
+ // snap = unpackInt(snap).remaining; // size
296
+ /* key = (((type_id) << 16) | (id))
297
+ * key_to_id = ((key) & 0xffff)
298
+ * key_to_type_id = ((key >> 16) & 0xffff)
299
+ * https://github.com/heinrich5991/libtw2/blob/master/snapshot/src/
300
+ * https://github.com/heinrich5991/libtw2/blob/master/doc/snapshot.md
301
+ */
302
+ // snap = unpackInt(snap).remaining;
303
+ // console.log(unpackInt(snap).result, "tick?") // key?
304
+ // snap = unpackInt(snap).remaining;
305
+ var num_removed_items = unpacker.unpackInt();
306
+ var num_item_deltas = unpacker.unpackInt();
307
+ unpacker.unpackInt(); // _zero padding
308
+ /*snapshot_delta:
309
+ [ 4] num_removed_items
310
+ [ 4] num_item_deltas
311
+ [ 4] _zero
312
+ [*4] removed_item_keys
313
+ [ ] item_deltas
314
+ */
315
+ for (var i = 0; i < num_removed_items; i++) {
316
+ unpacker.unpackInt(); // removed_item_keys
317
+ }
318
+ /*item_delta:
319
+ [ 4] type_id
320
+ [ 4] id
321
+ [ 4] _size
322
+ [*4] data_delta*/
323
+ var items = { items: [], /* client_infos: client_infos, player_infos: player_infos,*/ lost: 0 };
324
+ for (var i = 0; i < num_item_deltas; i++) {
325
+ var type_id = unpacker.unpackInt();
326
+ var id = unpacker.unpackInt();
327
+ var key = (((type_id) << 16) | (id));
328
+ var _size = void 0;
329
+ if (type_id > 0 && type_id < exports.itemAppendix.length) {
330
+ _size = exports.itemAppendix[type_id].size;
331
+ }
332
+ else
333
+ _size = unpacker.unpackInt();
334
+ var data = [];
335
+ for (var j = 0; j < _size; j++) {
336
+ if (unpacker.remaining.length > 0)
337
+ data.push(unpacker.unpackInt());
338
+ }
339
+ // console.log(type_id, id, _size, data);
340
+ var parsed = this.parseItem(data, type_id);
341
+ // console.log(data)
342
+ // console.log('')
343
+ items.items.push({ data: data, parsed: parsed, type_id: type_id, id: id, key: key });
344
+ }
345
+ return items;
346
+ };
347
+ return Snapshot;
348
+ }());
349
+ exports.Snapshot = Snapshot;
350
+ // module.exports = MsgPacker;
351
+ // export {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 = ''
@@ -352,4 +354,4 @@ class Snapshot {
352
354
  return items;
353
355
  }}
354
356
  // module.exports = MsgPacker;
355
- export {Snapshot};
357
+ // 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.7",
4
4
  "description": "Library for (ingame) teeworlds bots.",
5
5
  "license": "MIT",
6
6
  "main": "index.js",