about summary refs log tree commit diff stats
path: root/Archipelago/tracker.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Archipelago/tracker.gd')
-rw-r--r--Archipelago/tracker.gd89
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 @@
1extends Node
2
3var autotracker_port = 41253
4
5var _server = WebSocketServer.new()
6var _peers = []
7
8
9func _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
17func _process(_delta):
18 _server.poll()
19
20
21func _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
37func _connection_dropped(id, _was_clean_close):
38 _peers.erase(id)
39
40
41func _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
68func _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
84func has_connection():
85 return _peers.size() > 0
86
87
88func update_position(x, z):
89 _broadcast({"cmd": "UpdatePosition", "position": {"x": x, "z": z}})