diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-17 16:01:19 -0500 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-17 16:01:19 -0500 |
commit | 1bdfb112b659a6e4447ae8ed02c452bf12d8700a (patch) | |
tree | 0285f67a9600b83616edb69d209e3ebaf47cbae8 | |
parent | 45fa76505dd00bdd6665bae476277371fb1252a2 (diff) | |
download | lingo-archipelago-1bdfb112b659a6e4447ae8ed02c452bf12d8700a.tar.gz lingo-archipelago-1bdfb112b659a6e4447ae8ed02c452bf12d8700a.tar.bz2 lingo-archipelago-1bdfb112b659a6e4447ae8ed02c452bf12d8700a.zip |
Add position tracking via IPC
-rw-r--r-- | Archipelago/client.gd | 1 | ||||
-rw-r--r-- | Archipelago/load.gd | 6 | ||||
-rw-r--r-- | Archipelago/player.gd | 29 | ||||
-rw-r--r-- | Archipelago/settings_screen.gd | 1 | ||||
-rw-r--r-- | Archipelago/tracker.gd | 84 |
5 files changed, 121 insertions, 0 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 85cfd05..384c907 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
@@ -9,6 +9,7 @@ var SCRIPT_notifier | |||
9 | var SCRIPT_panel | 9 | var SCRIPT_panel |
10 | var SCRIPT_pilgrimage_terminator | 10 | var SCRIPT_pilgrimage_terminator |
11 | var SCRIPT_textclient | 11 | var SCRIPT_textclient |
12 | var SCRIPT_tracker | ||
12 | var SCRIPT_uuid | 13 | var SCRIPT_uuid |
13 | 14 | ||
14 | var ap_server = "" | 15 | var ap_server = "" |
diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 651fc39..ba350f6 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd | |||
@@ -692,6 +692,12 @@ func _load(): | |||
692 | multiplayer_node.ghost_mode = true | 692 | multiplayer_node.ghost_mode = true |
693 | add_child(multiplayer_node) | 693 | add_child(multiplayer_node) |
694 | 694 | ||
695 | # Create the autotracker node. | ||
696 | var autotracker_script = apclient.SCRIPT_tracker | ||
697 | var autotracker = autotracker_script.new() | ||
698 | autotracker.set_name("AP_Tracker") | ||
699 | self.add_child(autotracker) | ||
700 | |||
695 | # Hook up Geronimo handler. | 701 | # Hook up Geronimo handler. |
696 | $player.connect("player_jumped", apclient, "geronimo") | 702 | $player.connect("player_jumped", apclient, "geronimo") |
697 | 703 | ||
diff --git a/Archipelago/player.gd b/Archipelago/player.gd index 52d743a..6638329 100644 --- a/Archipelago/player.gd +++ b/Archipelago/player.gd | |||
@@ -2,12 +2,16 @@ extends "res://scripts/player.gd" | |||
2 | 2 | ||
3 | 3 | ||
4 | var _oldpos = Vector3(0, -200, 0) | 4 | var _oldpos = Vector3(0, -200, 0) |
5 | var _oldpos_fine = Vector3(0, -200, 0) | ||
5 | 6 | ||
6 | 7 | ||
7 | func _ready(): | 8 | func _ready(): |
8 | _oldpos = translation | 9 | _oldpos = translation |
9 | _oldpos.y = 0 | 10 | _oldpos.y = 0 |
10 | 11 | ||
12 | _oldpos_fine = translation | ||
13 | _oldpos_fine.y = 0 | ||
14 | |||
11 | var apclient = global.get_node("Archipelago") | 15 | var apclient = global.get_node("Archipelago") |
12 | if apclient.track_player: | 16 | if apclient.track_player: |
13 | var tracking_timer = Timer.new() | 17 | var tracking_timer = Timer.new() |
@@ -17,8 +21,19 @@ func _ready(): | |||
17 | tracking_timer.connect("timeout", self, "_tick_tracking") | 21 | tracking_timer.connect("timeout", self, "_tick_tracking") |
18 | tracking_timer.start() | 22 | tracking_timer.start() |
19 | 23 | ||
24 | var tracking_timer_fine = Timer.new() | ||
25 | tracking_timer_fine.name = "TrackingTimerFine" | ||
26 | tracking_timer_fine.wait_time = 0.5 | ||
27 | add_child(tracking_timer_fine) | ||
28 | tracking_timer_fine.connect("timeout", self, "_tick_tracking_fine") | ||
29 | tracking_timer_fine.start() | ||
30 | |||
20 | 31 | ||
21 | func _tick_tracking(): | 32 | func _tick_tracking(): |
33 | var tracker = get_tree().get_root().get_node("Spatial/AP_Tracker") | ||
34 | if tracker.has_connection(): | ||
35 | return | ||
36 | |||
22 | var newpos = translation | 37 | var newpos = translation |
23 | newpos.y = 0 | 38 | newpos.y = 0 |
24 | 39 | ||
@@ -29,6 +44,20 @@ func _tick_tracking(): | |||
29 | apclient.setValue("PlayerPos", {"x": int(_oldpos.x), "z": int(_oldpos.z)}) | 44 | apclient.setValue("PlayerPos", {"x": int(_oldpos.x), "z": int(_oldpos.z)}) |
30 | 45 | ||
31 | 46 | ||
47 | func _tick_tracking_fine(): | ||
48 | var tracker = get_tree().get_root().get_node("Spatial/AP_Tracker") | ||
49 | if !tracker.has_connection(): | ||
50 | return | ||
51 | |||
52 | var newpos = translation | ||
53 | newpos.y = 0 | ||
54 | |||
55 | if newpos != _oldpos_fine && newpos.distance_to(_oldpos_fine) > 0.5: | ||
56 | _oldpos_fine = newpos | ||
57 | |||
58 | tracker.update_position(int(_oldpos_fine.x), int(_oldpos_fine.z)) | ||
59 | |||
60 | |||
32 | func _solving(): | 61 | func _solving(): |
33 | ._solving() | 62 | ._solving() |
34 | 63 | ||
diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 2ed8594..d3c654c 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd | |||
@@ -33,6 +33,7 @@ func _ready(): | |||
33 | var pilg_term = load("user://maps/Archipelago/pilgrimage_terminator.gd") | 33 | var pilg_term = load("user://maps/Archipelago/pilgrimage_terminator.gd") |
34 | apclient_instance.SCRIPT_pilgrimage_terminator = pilg_term | 34 | apclient_instance.SCRIPT_pilgrimage_terminator = pilg_term |
35 | apclient_instance.SCRIPT_textclient = load("user://maps/Archipelago/textclient.gd") | 35 | apclient_instance.SCRIPT_textclient = load("user://maps/Archipelago/textclient.gd") |
36 | apclient_instance.SCRIPT_tracker = load("user://maps/Archipelago/tracker.gd") | ||
36 | apclient_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd") | 37 | apclient_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd") |
37 | 38 | ||
38 | var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") | 39 | var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") |
diff --git a/Archipelago/tracker.gd b/Archipelago/tracker.gd new file mode 100644 index 0000000..798721d --- /dev/null +++ b/Archipelago/tracker.gd | |||
@@ -0,0 +1,84 @@ | |||
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 = {"cmd": "Connect", "slot": {"server": apclient.ap_server, "player": apclient.ap_user}} | ||
27 | |||
28 | var peer = _server.get_peer(id) | ||
29 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
30 | peer.put_packet(JSON.print(msg).to_utf8()) | ||
31 | |||
32 | |||
33 | func _connection_dropped(id, _was_clean_close): | ||
34 | _peers.erase(id) | ||
35 | |||
36 | |||
37 | func _data_received(id): | ||
38 | var peer = _server.get_peer(id) | ||
39 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
40 | |||
41 | var packet_text = peer.get_packet().get_string_from_utf8() | ||
42 | global._print("Got data from tracker: " + packet_text) | ||
43 | var msg = JSON.parse(packet_text) | ||
44 | if msg.error != OK: | ||
45 | global._print("Error parsing packet from Tracker: " + msg.error_string) | ||
46 | return | ||
47 | |||
48 | var apclient = global.get_node("Archipelago") | ||
49 | |||
50 | if msg["cmd"] == "Sync": | ||
51 | var resp = {} | ||
52 | |||
53 | if apclient.track_player: | ||
54 | var player = get_tree().get_root().get_node("Spatial/player") | ||
55 | resp = { | ||
56 | "cmd": "UpdatePosition", | ||
57 | "position": {"x": int(player._oldpos_fine.x), "z": int(player._oldpos_fine.z)} | ||
58 | } | ||
59 | |||
60 | peer.put_packet(JSON.print(resp).to_utf8()) | ||
61 | |||
62 | |||
63 | func _broadcast(msg): | ||
64 | var to_remove = [] | ||
65 | var serialized = JSON.print(msg).to_utf8() | ||
66 | |||
67 | for peer_id in _peers: | ||
68 | if _server.has_peer(peer_id): | ||
69 | var peer = _server.get_peer(peer_id) | ||
70 | peer.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) | ||
71 | peer.put_packet(serialized) | ||
72 | else: | ||
73 | to_remove.append(peer_id) | ||
74 | |||
75 | for peer_id in to_remove: | ||
76 | _peers.erase(peer_id) | ||
77 | |||
78 | |||
79 | func has_connection(): | ||
80 | return _peers.size() > 0 | ||
81 | |||
82 | |||
83 | func update_position(x, z): | ||
84 | _broadcast({"cmd": "UpdatePosition", "position": {"x": x, "z": z}}) | ||