ddbot.js-0374 4.4.1 → 4.4.3
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 +21 -22
- package/lib/modules/playerlist.d.ts +20 -0
- package/lib/modules/playerlist.js +12 -0
- package/lib/modules/reconnect.d.ts +15 -0
- package/lib/modules/reconnect.js +13 -1
- package/lib/modules/snap.d.ts +27 -0
- package/lib/modules/snap.js +20 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,29 +23,28 @@ const ddbot = require('ddbot.js-0374');
|
|
|
23
23
|
```ts
|
|
24
24
|
import * as ddbot from '../lib/index.js';
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
const bot = new ddbot.Bot(/* identity, options, custom teeworlds */);
|
|
27
|
+
// if no identity is provided, it will be default 'nameless tee' with default skin
|
|
28
|
+
|
|
29
|
+
bot.on('connect', () => {
|
|
30
|
+
console.log('Connected to server!');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
bot.on('disconnect', () => {
|
|
34
|
+
console.log('Disconnected from server!');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
(async () => {
|
|
38
|
+
await bot.connect('45.141.57.22', 8303, 20000); // IP, port, timeout (IP is of ddnet server)
|
|
39
|
+
bot.bot_client?.game.Say('DDNet!'); // from teeworlds
|
|
40
|
+
setTimeout(async () => {
|
|
41
|
+
await bot.disconnect();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}, 5000); // 5 sec
|
|
44
|
+
process.on('SIGINT', async () => { // on Ctrl+C
|
|
45
|
+
await bot.disconnect();
|
|
46
|
+
process.exit(0);
|
|
35
47
|
});
|
|
36
|
-
|
|
37
|
-
(async () => {
|
|
38
|
-
await bot.connect('45.141.57.22', 8303, 20000); // IP, port, timeout (IP is of ddnet server)
|
|
39
|
-
bot.bot_client?.game.Say('DDNet!'); // from teeworlds
|
|
40
|
-
setTimeout(async () => {
|
|
41
|
-
await bot.disconnect();
|
|
42
|
-
process.exit(0);
|
|
43
|
-
}, 5000); // 5 sec
|
|
44
|
-
|
|
45
|
-
process.on('SIGINT', async () => { // on Ctrl+C
|
|
46
|
-
await bot.disconnect();
|
|
47
|
-
process.exit(0);
|
|
48
|
-
});
|
|
49
48
|
})();
|
|
50
49
|
```
|
|
51
50
|
|
|
@@ -8,6 +8,22 @@ interface PlayerData {
|
|
|
8
8
|
character: Types.SnapshotItemTypes.Character | null;
|
|
9
9
|
DDNetCharacter: Types.SnapshotItemTypes.DDNetCharacter | null;
|
|
10
10
|
}
|
|
11
|
+
interface PlayerJoinedInfo {
|
|
12
|
+
client_id: number;
|
|
13
|
+
name: string;
|
|
14
|
+
playerData: PlayerData;
|
|
15
|
+
}
|
|
16
|
+
interface PlayerLeftInfo {
|
|
17
|
+
client_id: number;
|
|
18
|
+
name: string;
|
|
19
|
+
playerData: PlayerData;
|
|
20
|
+
}
|
|
21
|
+
interface PlayerListEvents {
|
|
22
|
+
/** Игрок появился в снапшоте (зашёл на сервер) */
|
|
23
|
+
player_joined: (info: PlayerJoinedInfo) => void;
|
|
24
|
+
/** Игрок пропал из снапшота (вышел с сервера) */
|
|
25
|
+
player_left: (info: PlayerLeftInfo) => void;
|
|
26
|
+
}
|
|
11
27
|
declare class PlayerList extends BaseModule<[maxclients?: number]> {
|
|
12
28
|
constructor(bot: Bot);
|
|
13
29
|
private client;
|
|
@@ -29,5 +45,9 @@ declare class PlayerList extends BaseModule<[maxclients?: number]> {
|
|
|
29
45
|
getPlayerCount(): number;
|
|
30
46
|
protected _start(maxclients?: number): void;
|
|
31
47
|
protected _stop(): void;
|
|
48
|
+
on<K extends keyof PlayerListEvents>(event: K, listener: PlayerListEvents[K]): this;
|
|
49
|
+
once<K extends keyof PlayerListEvents>(event: K, listener: PlayerListEvents[K]): this;
|
|
50
|
+
emit<K extends keyof PlayerListEvents>(event: K, ...args: Parameters<PlayerListEvents[K]>): boolean;
|
|
51
|
+
off<K extends keyof PlayerListEvents>(event: K, listener: PlayerListEvents[K]): this;
|
|
32
52
|
}
|
|
33
53
|
export default PlayerList;
|
|
@@ -79,5 +79,17 @@ class PlayerList extends module_js_1.default {
|
|
|
79
79
|
this.playermap.clear();
|
|
80
80
|
this.previousMap.clear();
|
|
81
81
|
}
|
|
82
|
+
on(event, listener) {
|
|
83
|
+
return super.on(event, listener);
|
|
84
|
+
}
|
|
85
|
+
once(event, listener) {
|
|
86
|
+
return super.once(event, listener);
|
|
87
|
+
}
|
|
88
|
+
emit(event, ...args) {
|
|
89
|
+
return super.emit(event, ...args);
|
|
90
|
+
}
|
|
91
|
+
off(event, listener) {
|
|
92
|
+
return super.off(event, listener);
|
|
93
|
+
}
|
|
82
94
|
}
|
|
83
95
|
exports.default = PlayerList;
|
|
@@ -7,6 +7,17 @@ export interface ReconnectingInfo {
|
|
|
7
7
|
reason: string | null;
|
|
8
8
|
ConnectionInfo: Types.ConnectionInfo;
|
|
9
9
|
}
|
|
10
|
+
interface ReconnectEvents {
|
|
11
|
+
/** Начинается попытка переподключения */
|
|
12
|
+
reconnecting: (info: ReconnectingInfo) => void;
|
|
13
|
+
/** Успешно переподключились */
|
|
14
|
+
reconnected: (info: {
|
|
15
|
+
addr: string;
|
|
16
|
+
port: number;
|
|
17
|
+
}) => void;
|
|
18
|
+
/** Переподключение не удалось (исчерпаны попытки или нет данных о сервере) */
|
|
19
|
+
reconnect_failed: (reason: string | number | unknown) => void;
|
|
20
|
+
}
|
|
10
21
|
declare class Reconnect extends BaseModule<[maxAttempts?: number, randomDelay?: boolean]> {
|
|
11
22
|
private maxAttempts;
|
|
12
23
|
private randomDelay;
|
|
@@ -18,5 +29,9 @@ declare class Reconnect extends BaseModule<[maxAttempts?: number, randomDelay?:
|
|
|
18
29
|
private handleDisconnect;
|
|
19
30
|
private calculateDelay;
|
|
20
31
|
protected _stop(): void;
|
|
32
|
+
on<K extends keyof ReconnectEvents>(event: K, listener: ReconnectEvents[K]): this;
|
|
33
|
+
once<K extends keyof ReconnectEvents>(event: K, listener: ReconnectEvents[K]): this;
|
|
34
|
+
emit<K extends keyof ReconnectEvents>(event: K, ...args: Parameters<ReconnectEvents[K]>): boolean;
|
|
35
|
+
off<K extends keyof ReconnectEvents>(event: K, listener: ReconnectEvents[K]): this;
|
|
21
36
|
}
|
|
22
37
|
export default Reconnect;
|
package/lib/modules/reconnect.js
CHANGED
|
@@ -72,7 +72,7 @@ class Reconnect extends module_js_1.default {
|
|
|
72
72
|
baseDelay = 500;
|
|
73
73
|
}
|
|
74
74
|
if (this.randomDelay) {
|
|
75
|
-
return baseDelay + Math.random() *
|
|
75
|
+
return baseDelay + Math.random() * 5000;
|
|
76
76
|
}
|
|
77
77
|
return baseDelay;
|
|
78
78
|
}
|
|
@@ -85,5 +85,17 @@ class Reconnect extends module_js_1.default {
|
|
|
85
85
|
this.reconnectTimer = null;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
+
on(event, listener) {
|
|
89
|
+
return super.on(event, listener);
|
|
90
|
+
}
|
|
91
|
+
once(event, listener) {
|
|
92
|
+
return super.once(event, listener);
|
|
93
|
+
}
|
|
94
|
+
emit(event, ...args) {
|
|
95
|
+
return super.emit(event, ...args);
|
|
96
|
+
}
|
|
97
|
+
off(event, listener) {
|
|
98
|
+
return super.off(event, listener);
|
|
99
|
+
}
|
|
88
100
|
}
|
|
89
101
|
exports.default = Reconnect;
|
package/lib/modules/snap.d.ts
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import BaseModule from '../core/module.js';
|
|
2
2
|
import type { Bot } from '../core/core.js';
|
|
3
3
|
import * as Types from '../types.js';
|
|
4
|
+
interface HammerHit {
|
|
5
|
+
common: {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
};
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
interface SnapEvents {
|
|
12
|
+
/** Бота ударили молотком (hammer hit попал в тайл персонажа) */
|
|
13
|
+
hammerhitme: (hit: HammerHit, attackerId: number | null) => void;
|
|
14
|
+
/** Кто-то выстрелил рядом (sound_id === 0) */
|
|
15
|
+
fire: (common: {
|
|
16
|
+
common: {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
}, nearestClient: number | null) => void;
|
|
21
|
+
/** Персонаж заморожен */
|
|
22
|
+
frozen: () => void;
|
|
23
|
+
/** Персонаж разморожен */
|
|
24
|
+
unfrozen: () => void;
|
|
25
|
+
}
|
|
4
26
|
declare class Snap extends BaseModule {
|
|
5
27
|
private _isFrozen;
|
|
6
28
|
private readonly hammerHitlistener;
|
|
@@ -14,7 +36,12 @@ declare class Snap extends BaseModule {
|
|
|
14
36
|
y: number;
|
|
15
37
|
} | null;
|
|
16
38
|
get isFrozen(): boolean;
|
|
39
|
+
lookatplayer(client_id: number): void;
|
|
17
40
|
protected _start(): void;
|
|
18
41
|
protected _stop(): void;
|
|
42
|
+
on<K extends keyof SnapEvents>(event: K, listener: SnapEvents[K]): this;
|
|
43
|
+
once<K extends keyof SnapEvents>(event: K, listener: SnapEvents[K]): this;
|
|
44
|
+
emit<K extends keyof SnapEvents>(event: K, ...args: Parameters<SnapEvents[K]>): boolean;
|
|
45
|
+
off<K extends keyof SnapEvents>(event: K, listener: SnapEvents[K]): this;
|
|
19
46
|
}
|
|
20
47
|
export default Snap;
|
package/lib/modules/snap.js
CHANGED
|
@@ -72,6 +72,14 @@ class Snap extends module_js_1.default {
|
|
|
72
72
|
get isFrozen() {
|
|
73
73
|
return this._isFrozen;
|
|
74
74
|
}
|
|
75
|
+
lookatplayer(client_id) {
|
|
76
|
+
const pl_character = this.bot.bot_client?.SnapshotUnpacker.getObjCharacter(client_id);
|
|
77
|
+
const own_character = this.bot.bot_client?.SnapshotUnpacker.getObjCharacter(this.bot.OwnID);
|
|
78
|
+
if (!pl_character || !own_character)
|
|
79
|
+
return;
|
|
80
|
+
const angle = Math.atan2(pl_character.character_core.y - own_character.character_core.y, pl_character.character_core.x - own_character.character_core.x);
|
|
81
|
+
this.bot.send_input({ target_x: Math.cos(angle) * 256, target_y: Math.sin(angle) * 256 });
|
|
82
|
+
}
|
|
75
83
|
_start() {
|
|
76
84
|
this.bot.on('snapshot', this.snapslistener);
|
|
77
85
|
this.bot.on('hammerhit', this.hammerHitlistener);
|
|
@@ -82,5 +90,17 @@ class Snap extends module_js_1.default {
|
|
|
82
90
|
this.bot.off('hammerhit', this.hammerHitlistener);
|
|
83
91
|
this.bot.off('sound_world', this.firelistener);
|
|
84
92
|
}
|
|
93
|
+
on(event, listener) {
|
|
94
|
+
return super.on(event, listener);
|
|
95
|
+
}
|
|
96
|
+
once(event, listener) {
|
|
97
|
+
return super.once(event, listener);
|
|
98
|
+
}
|
|
99
|
+
emit(event, ...args) {
|
|
100
|
+
return super.emit(event, ...args);
|
|
101
|
+
}
|
|
102
|
+
off(event, listener) {
|
|
103
|
+
return super.off(event, listener);
|
|
104
|
+
}
|
|
85
105
|
}
|
|
86
106
|
exports.default = Snap;
|