## freeftf ## Copyright (C) 2024 Patrick_Pluto ## ## This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License along with this program. If not, see . extends Node const DEFAULT_SERVER_IP = "127.0.0.1" const PORT = 36969 const MAX_CONNECTIONS = 16 var players = {} var players_numbered = [] var label var map var character = preload("res://objects/player.tscn") var is_server = false var first_joined = true var game_master = "debug" var map_name = "mansion" var offline func _ready(): offline = multiplayer.multiplayer_peer multiplayer.peer_disconnected.connect(_on_player_disconnected) multiplayer.server_disconnected.connect(_on_server_disconnected) func _on_player_disconnected(id): players.erase(id) if (players.is_empty() or id == game_master) and multiplayer.is_server(): get_tree().quit() var x = 0 if !multiplayer.is_server(): for i in players_numbered: if i == id: var current_character = get_tree().root.get_node("./"+map_name+"/player"+str(x)) if current_character.hp == 0: Game.dead -= 1 elif current_character.is_frozen: Game.frozen -= 1 elif current_character.beast: Game.player_escaped = true Game.players = 0 else: Game.players -= 1 current_character.free() x += 1 func _on_server_disconnected(): Server.reset() Game.reset() get_tree().change_scene_to_file("res://menus/main_menu.tscn") func reset(): players = {} players_numbered = [] label = null map = null is_server = false first_joined = true game_master = "debug" character = preload("res://objects/player.tscn") if multiplayer != null: multiplayer.multiplayer_peer = offline func join_game(ip): var peer = ENetMultiplayerPeer.new() var error = peer.create_client(ip, PORT) if error: return error multiplayer.multiplayer_peer = peer func create_game(): var peer = ENetMultiplayerPeer.new() var error = peer.create_server(PORT, MAX_CONNECTIONS) if error: return error multiplayer.multiplayer_peer = peer func _process(delta): if multiplayer.is_server(): make_host.rpc(game_master) @rpc("authority","call_remote","reliable") func make_host(id): first_joined = false game_master = id if str(multiplayer.get_unique_id()) == str(game_master): is_server = true else: is_server = false @rpc("any_peer", "call_remote", "reliable") func sync_playerlist(text, host): if !multiplayer.is_server() and (multiplayer.get_remote_sender_id() == game_master or multiplayer.get_remote_sender_id() == 0): get_tree().root.get_node("create/player_list/list").text = text @rpc("any_peer", "call_local", "reliable") func send_playerinfo(player_name, id): if !multiplayer.is_server(): if is_server: var done = 0 players[id] = player_name label = get_tree().root.get_node("create/player_list/list") label.text = "" for w in players: if done == 1: label.text = str(label.text +"\n" + players[w]) else: label.text = players[w] done = 1 else: players[id] = player_name if first_joined: first_joined = false game_master = id is_server = true @rpc("any_peer", "call_local", "reliable") func start_game(server_players): if !multiplayer.is_server() and (multiplayer.get_remote_sender_id() == game_master or multiplayer.get_remote_sender_id() == 0): players = server_players players_numbered = players.keys() var success = get_tree().change_scene_to_file("res://maps/"+map_name+".tscn") while !get_tree().root.has_node("./"+map_name+"/"): await get_tree().create_timer(0.001).timeout map = get_tree().root.get_node("./"+map_name+"/") var i = 0 for w in players: var player = character.instantiate() player.name = "player" + str(i) i += 1 player.position.z = -i*2.5 player.position.y = 1 map.add_child(player) if Server.is_server: var random = randi() % Server.players.size() sync_beast.rpc(random) Game.apply_settings() @rpc("any_peer", "call_remote", "unreliable") func sync_player(node_name, position, rotation): if !multiplayer.is_server(): var current_character = get_tree().root.get_node("./"+map_name+"/"+node_name) current_character.position = position current_character.rotation = rotation @rpc("any_peer", "call_remote", "unreliable") func sync_hammer(node_name, rotation): if !multiplayer.is_server(): var current_character = get_tree().root.get_node("./"+map_name+"/"+node_name+"/hammer") current_character.rotation = rotation @rpc("any_peer", "call_local", "reliable") func sync_computers(node_name, current): if !multiplayer.is_server() and (multiplayer.get_remote_sender_id() == game_master or multiplayer.get_remote_sender_id() == 0): var current_character = get_tree().root.get_node("./"+map_name+"/computers/"+node_name) current_character.current = current @rpc("any_peer", "call_local", "reliable") func sync_beast(player): if !multiplayer.is_server() and (multiplayer.get_remote_sender_id() == game_master or multiplayer.get_remote_sender_id() == 0): while !get_tree().root.has_node("./"+map_name+"/player"+str(player)): await get_tree().create_timer(0.001).timeout var current_character = get_tree().root.get_node("./"+map_name+"/player"+str(player)) current_character.beast_init() @rpc("any_peer", "call_local", "reliable") func player_hit(target, beast): if !multiplayer.is_server(): target = get_tree().root.get_node("./"+map_name+"/"+target) beast = get_tree().root.get_node("./"+map_name+"/"+beast) if !target.is_frozen: target.captured(beast) beast.got_one(target)