diff options
Diffstat (limited to 'Archipelago/tracker.gd')
-rw-r--r-- | Archipelago/tracker.gd | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/Archipelago/tracker.gd b/Archipelago/tracker.gd new file mode 100644 index 0000000..9def744 --- /dev/null +++ b/Archipelago/tracker.gd | |||
@@ -0,0 +1,89 @@ | |||
1 | extends Node | ||
2 | |||
3 | var autotracker_port = 41253 | ||
4 | |||
5 | var _server = WebSocketServer.new() | ||
6 | var _peers = [] | ||
7 | |||
8 | |||
9 | func _ready(): | ||
10 | _server.bind_ip = "127.0.0.1" | ||
11 | _server.connect("client_connected", self, "_connection_established") | ||
12 | _server.connect("client_disconnected", self, "_connection_dropped") | ||
13 | _server.connect("data_received", self, "_data_received") | ||
14 | _server.listen(autotracker_port) | ||
15 | |||
16 | |||
17 | func _process(_delta): | ||
18 | _server.poll() | ||
19 | |||
20 | |||
21 | func _connection_established(id, _protocol): | ||
22 | _peers.append(id) | ||
23 | |||
24 | var apclient = global.get_node("Archipelago") | ||
25 | |||
26 | var msg = { | ||
27 | "cmd": "Connect", | ||
28 | "slot": | ||
29 | {"server": apclient.ap_server, "player": apclient.ap_user, "password": apclient.ap_pass} | ||
30 | } | ||
31 | |||
32 | var peer = _server.get_peer(id) | ||
33 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
34 | peer.put_packet(JSON.print(msg).to_utf8()) | ||
35 | |||
36 | |||
37 | func _connection_dropped(id, _was_clean_close): | ||
38 | _peers.erase(id) | ||
39 | |||
40 | |||
41 | func _data_received(id): | ||
42 | var peer = _server.get_peer(id) | ||
43 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
44 | |||
45 | var packet_text = peer.get_packet().get_string_from_utf8() | ||
46 | global._print("Got data from tracker: " + packet_text) | ||
47 | var data = JSON.parse(packet_text) | ||
48 | if data.error != OK: | ||
49 | global._print("Error parsing packet from Tracker: " + data.error_string) | ||
50 | return | ||
51 | |||
52 | var apclient = global.get_node("Archipelago") | ||
53 | var msg = data.result | ||
54 | |||
55 | if msg["cmd"] == "Sync": | ||
56 | var resp = {} | ||
57 | |||
58 | if apclient.track_player: | ||
59 | var player = get_tree().get_root().get_node("Spatial/player") | ||
60 | resp = { | ||
61 | "cmd": "UpdatePosition", | ||
62 | "position": {"x": int(player._oldpos_fine.x), "z": int(player._oldpos_fine.z)} | ||
63 | } | ||
64 | |||
65 | peer.put_packet(JSON.print(resp).to_utf8()) | ||
66 | |||
67 | |||
68 | func _broadcast(msg): | ||
69 | var to_remove = [] | ||
70 | var serialized = JSON.print(msg).to_utf8() | ||
71 | |||
72 | for peer_id in _peers: | ||
73 | if _server.has_peer(peer_id): | ||
74 | var peer = _server.get_peer(peer_id) | ||
75 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
76 | peer.put_packet(serialized) | ||
77 | else: | ||
78 | to_remove.append(peer_id) | ||
79 | |||
80 | for peer_id in to_remove: | ||
81 | _peers.erase(peer_id) | ||
82 | |||
83 | |||
84 | func has_connection(): | ||
85 | return _peers.size() > 0 | ||
86 | |||
87 | |||
88 | func update_position(x, z): | ||
89 | _broadcast({"cmd": "UpdatePosition", "position": {"x": x, "z": z}}) | ||