Added a basic test map, options menu, bug fixes, and much more.
This commit is contained in:
Patrick 2025-08-08 10:57:42 +02:00
parent d72b5ac57b
commit 2dce012535
34 changed files with 1268 additions and 84 deletions

View file

@ -1,15 +1,16 @@
class_name MultiplayerClass
extends Node
const ADDRESS: String = "127.0.0.1"
const PORT: int = 4516
var peer: ENetMultiplayerPeer = null
var players: Array[Dictionary] = []
var players: Dictionary = {}
var fuseboxes: int = 0
var playerlist_label: Label = null
var entered_username: String = ""
## Host Specific
# Hosts server
@ -19,39 +20,58 @@ func host_server() -> void:
peer = null
return
multiplayer.multiplayer_peer = peer
if multiplayer.peer_connected.connect(_on_player_joined) != OK:
print("Failed to connect signal")
if multiplayer.peer_disconnected.connect(_on_player_left) != OK:
print("Failed to connect signal")
if get_tree().change_scene_to_file("res://ui/lobby.tscn") != OK:
print("Failed to change to scene.")
_on_player_joined(multiplayer.get_unique_id())
player_username.rpc_id(1, Options.username)
# Runs when player joins
func _on_player_joined(id: int) -> void:
players.push_back({
players[id] = {
"id": id,
"username": "Waiting...",
"loaded": false,
"hunter": false,
"captured": false,
"escaped": false,
})
}
send_playerlist()
# Runs when player leaves
func _on_player_left(id: int) -> void:
players = players.filter(func (player: Dictionary) -> bool: return player.id != id)
if !players.erase(id):
print("Player was never registered!")
send_playerlist()
# Receives the players username
@rpc("any_peer", "call_local", "reliable")
func player_username(username: String) -> void:
players[multiplayer.get_remote_sender_id()].username = username
send_playerlist()
# Prepares the label text for the playerlist on the join/host screen
func send_playerlist() -> void:
var playerlist: String = ""
for player: Dictionary in players:
playerlist += str(player.id)
for id: int in players:
playerlist += players[id].username
playerlist += "\n"
update_playerlist.rpc(playerlist)
@rpc("any_peer", "call_local", "reliable")
func request_playerlist() -> void:
if multiplayer.is_server():
send_playerlist()
# Switches the scene, and waits until everyone is fully loaded.
@rpc("authority", "call_local", "reliable")
func switch_scene(path: String) -> void:
@ -60,8 +80,8 @@ func switch_scene(path: String) -> void:
_scene_loaded.rpc_id(1)
while true:
var loaded: bool = true
for player: Dictionary in players:
if player.loaded == false:
for id: int in players:
if players[id].loaded == false:
loaded = false
break
if loaded:
@ -77,17 +97,14 @@ func switch_scene(path: String) -> void:
# Callback to switch_scene from the remote peer
@rpc("any_peer", "call_local", "reliable")
func _scene_loaded() -> void:
var id: int = multiplayer.get_remote_sender_id()
if multiplayer.is_server():
for i: int in range(players.size()):
if players[i].id == multiplayer.get_remote_sender_id():
players[i].loaded = true
players[multiplayer.get_remote_sender_id()].loaded = true
func _process(_delta: float) -> void:
if multiplayer.multiplayer_peer and multiplayer.is_server() and !players.is_empty():
var lost: bool = true
for player: Dictionary in players:
if (!player.captured or !player.escaped) and !player.hunter:
for id: int in players:
if !(players[id].captured or players[id].escaped) and !players[id].hunter:
lost = false
if lost:
terminate_multiplayer.rpc()
@ -95,12 +112,34 @@ func _process(_delta: float) -> void:
## Client Specific
# Joins a server
func join_server() -> void:
func join_server(username: String = Options.username, ip_address: String = Options.ip_address) -> void:
if !username:
username = Options.username
if !ip_address:
ip_address = Options.ip_address
entered_username = username
peer = ENetMultiplayerPeer.new()
if peer.create_client(ADDRESS, PORT) != OK:
peer = null
if peer.create_client(ip_address, PORT) != OK:
terminate_multiplayer()
return
multiplayer.multiplayer_peer = peer
if multiplayer.connected_to_server.connect(_on_server_joined) != OK:
print("Failed to connect signal")
if multiplayer.connection_failed.connect(_on_server_join_failed) != OK:
print("Failed to connect signal")
# After successful join
func _on_server_joined() -> void:
if get_tree().change_scene_to_file("res://ui/lobby.tscn") != OK:
print("Failed to change to scene.")
player_username.rpc_id(1, entered_username)
# After unsuccessful join
func _on_server_join_failed() -> void:
terminate_multiplayer()
## Shared
@ -108,7 +147,7 @@ func join_server() -> void:
@rpc("authority", "call_local", "reliable")
func terminate_multiplayer() -> void:
multiplayer.multiplayer_peer = null
players = []
players = {}
fuseboxes = 0
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if get_tree().change_scene_to_file("res://ui/main_menu.tscn") != OK:
@ -119,3 +158,13 @@ func terminate_multiplayer() -> void:
func update_playerlist(list: String) -> void:
if playerlist_label != null:
playerlist_label.text = list
# Adds Fusebox
@rpc("authority", "call_local", "reliable")
func add_fusebox() -> void:
fuseboxes += 1
# Removes Fusebox
@rpc("authority", "call_local", "reliable")
func remove_fusebox() -> void:
fuseboxes -= 1

34
global/options.gd Normal file
View file

@ -0,0 +1,34 @@
class_name OptionsClass
extends Node
var username: String = "DefaultUsername"
var ip_address: String = "127.0.0.1"
var data_collection: bool = false
func _ready() -> void:
load_options()
func save_options() -> void:
var save_data: String = JSON.stringify({
"username": username,
"ip_address": ip_address,
"data_collection": data_collection,
})
var file: FileAccess = FileAccess.open("user://options.json", FileAccess.WRITE)
if file and !file.store_string(save_data):
print("Failed to save settings.")
func load_options() -> void:
var file: FileAccess = FileAccess.open("user://options.json", FileAccess.READ)
if file:
var save_data: Dictionary = JSON.parse_string(file.get_as_text())
if save_data:
if save_data.has("username"):
username = save_data.username
if save_data.has("ip_address"):
ip_address = save_data.ip_address
if save_data.has("data_collection"):
data_collection = save_data.data_collection

1
global/options.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://m3aryyjtncwx