diff options
Diffstat (limited to 'Archipelago/multiplayer.gd')
| -rw-r--r-- | Archipelago/multiplayer.gd | 55 | 
1 files changed, 55 insertions, 0 deletions
| diff --git a/Archipelago/multiplayer.gd b/Archipelago/multiplayer.gd index 0bc2241..c2d9875 100644 --- a/Archipelago/multiplayer.gd +++ b/Archipelago/multiplayer.gd | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | extends "res://scripts/multiplayer.gd" | 1 | extends "res://scripts/multiplayer.gd" | 
| 2 | 2 | ||
| 3 | var queued_messages = [] | ||
| 4 | var queued_messages_mutex = Mutex.new() | ||
| 5 | |||
| 3 | 6 | ||
| 4 | func _request_lobby_list(): | 7 | func _request_lobby_list(): | 
| 5 | var apclient = global.get_node("Archipelago") | 8 | var apclient = global.get_node("Archipelago") | 
| @@ -41,3 +44,55 @@ func _update_lobby_members(): | |||
| 41 | if member_id != player_steam_id and member_id in active_lobby_members: | 44 | if member_id != player_steam_id and member_id in active_lobby_members: | 
| 42 | var slot_name = Steam.getLobbyMemberData(active_lobby_id, member_id, "slot_name") | 45 | var slot_name = Steam.getLobbyMemberData(active_lobby_id, member_id, "slot_name") | 
| 43 | active_lobby_members[member_id].steam_name = slot_name | 46 | active_lobby_members[member_id].steam_name = slot_name | 
| 47 | |||
| 48 | |||
| 49 | func say(text): | ||
| 50 | queued_messages_mutex.lock() | ||
| 51 | queued_messages.append(text) | ||
| 52 | queued_messages_mutex.unlock() | ||
| 53 | |||
| 54 | |||
| 55 | func _physics_process(_delta): | ||
| 56 | if queued_messages_mutex.try_lock() == OK: | ||
| 57 | if queued_messages.empty(): | ||
| 58 | queued_messages_mutex.unlock() | ||
| 59 | else: | ||
| 60 | var messages = queued_messages.duplicate() | ||
| 61 | queued_messages = [] | ||
| 62 | queued_messages_mutex.unlock() | ||
| 63 | |||
| 64 | var player = get_tree().get_root().get_node("Spatial/player") | ||
| 65 | var space_state = get_tree().get_root().get_world().direct_space_state | ||
| 66 | var nearby_members = [] | ||
| 67 | for member_id in active_lobby_members.keys(): | ||
| 68 | var other_member = active_lobby_members[member_id] | ||
| 69 | var ray = space_state.intersect_ray( | ||
| 70 | player.global_translation, other_member.global_translation, [player], 0b0101 | ||
| 71 | ) | ||
| 72 | if !("collider" in ray) or ray["collider"] == other_member: | ||
| 73 | # Visible! | ||
| 74 | nearby_members.append(member_id) | ||
| 75 | |||
| 76 | var apclient = global.get_node("Archipelago") | ||
| 77 | var player_name = apclient.get_player_name() | ||
| 78 | for member_id in nearby_members: | ||
| 79 | for msg in messages: | ||
| 80 | _send_p2p_packet( | ||
| 81 | {"solves": [{"say": msg, "from": player_name}]}, | ||
| 82 | member_id, | ||
| 83 | Steam.P2P_SEND_RELIABLE, | ||
| 84 | true | ||
| 85 | ) | ||
| 86 | |||
| 87 | |||
| 88 | # I'm completely hijacking this callback, since we're in ghost mode and it won't be called normally. | ||
| 89 | func _receive_solve(data): | ||
| 90 | if "say" in data: | ||
| 91 | get_tree().get_root().get_node("Spatial/AP_TextClient").parse_printjson( | ||
| 92 | "[LOCAL] [color=#fafad2]%s[/color]: %s" % [data["from"], data["say"]] | ||
| 93 | ) | ||
| 94 | messages.showMessage("[color=#fafad2]%s[/color]: %s" % [data["from"], data["say"]]) | ||
| 95 | |||
| 96 | |||
| 97 | func _send_hi(_discard): | ||
| 98 | pass | ||
