From d3998186c9795f2a85148cd5bcfa1bd5b6226cfb Mon Sep 17 00:00:00 2001 From: Anson Bridges Date: Wed, 31 Aug 2022 00:26:34 -0700 Subject: Initialize repo --- scripts/Server.gd | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 scripts/Server.gd (limited to 'scripts/Server.gd') diff --git a/scripts/Server.gd b/scripts/Server.gd new file mode 100644 index 0000000..bd24911 --- /dev/null +++ b/scripts/Server.gd @@ -0,0 +1,110 @@ +extends Node + +var world +var motd : String +var server_name : String +var player_limit : int +var connected_player_count : int = 0 +var connected_players = {} + +var server_enet : NetworkedMultiplayerENet +var output +var output_func : String + +func print_line(line): + output.call(output_func, line) + +func _ready(): + get_tree().connect("network_peer_connected", self, "_client_connect") + get_tree().connect("network_peer_disconnected", self, "_client_disconnect") + +func start_server(_server_name: String, _motd: String, max_players: int, map_path: String, ip: String, port: int, root, output_obj, output_f): + output = output_obj + output_func = output_f + server_name = _server_name + motd = _motd + player_limit = max_players + + world = load(map_path) + if world: + world = world.instance() + else: + print_line("Error loading map.") + return + + world.add_child(self) + root.add_child(world) + world.client_id = 1 + + server_enet = NetworkedMultiplayerENet.new() + server_enet.create_server(port, max_players) + get_tree().set_network_peer(server_enet) + + print_line("Server started successfully.") + +func stop_server(): + print_line("Shutting down server...") + server_enet.close_connection() + print_line("Shut down successfully.") + world.queue_free() + +func _client_disconnect(id): + print_line("Client (ID: "+str(id)+") has disconnected.") + for character in world.get_node("PLAYERS").get_children(): + if character.get_network_master() == id: + character.rpc("set_owner", 1) + connected_players.erase(id) + connected_player_count -= 1 + world.rpc("update_players_info", connected_players) + +func _client_connect(id): + print_line("Client (ID: "+str(id)+") connecting...") + connected_player_count += 1 + connected_players[id] = ["", "SPEC"] #Placeholder for name + + var server_info = {"player_count" : connected_player_count, "server_name" : server_name, "MOTD" : motd, "cam_pos" : world.get_node("DEFAULTCAM").transform} + world.rpc_id(id, "set_up_server_info", server_info) + + var geo_info = [] + for world_geo in world.get_node("WORLDGEO").get_children(): + geo_info.append( { "filename" : world_geo.filename, "transform" : world_geo.transform }) + world.rpc_id(id, "load_map", geo_info) + + var ent_info = [] + for section in ["PLAYERS","MACHINES","BALLISTICS"]: + for item in world.get_node(section).get_children(): + ent_info.append({"type" : section, "net_master" : item.get_network_master(), "name" : item.name, "filename" : item.filename, "transform" : item.transform, "init_info" : item.get_init_info() }) + world.rpc_id(id, "load_entities", ent_info) + +func _client_connection_confirmed(arguments): + print_line("Client (ID: "+str(arguments["id"])+") connected as " +arguments["username"] +".") + connected_players[arguments["id"]] = [arguments["username"], "SPEC"] + world.rpc("update_players_info", connected_players) + +func _client_change_teams(arguments): + print_line(connected_players[arguments["id"]][0] + " ("+ str(arguments["id"]) +") changed to team " + arguments["team"]) + connected_players[arguments["id"]][1] = arguments["team"] + world.rpc("update_players_info", connected_players) + +func _client_request_change_character(arguments): + var dest = world.get_node("PLAYERS/"+arguments["char_name"]) + if dest.get_network_master() == 1: + print_line(connected_players[arguments["id"]][0] + " selected character " + arguments["char_name"]) + dest.rpc("set_owner", arguments["id"]) + if arguments["current_char_name"] != "NULL": + var old = world.get_node("PLAYERS/"+arguments["current_char_name"]) + old.rpc("set_owner", 1) + +func _character_death(arguments): + print(arguments) + var victim_player = connected_players[arguments["victim_mp_id"]][0] if arguments["victim_mp_id"] != 1 else "" + print_line(arguments["victim"] + " ("+victim_player+") killed by " + arguments["killer"] + " " + arguments["extra"] + ".") + world.rpc("game_chat_msg", arguments["victim"] + " ("+victim_player+") killed by " + arguments["killer"] + " " + arguments["extra"] + ".") + world.get_node("PLAYERS/"+arguments["victim"]).rpc("remove_dead") + world.rpc("game_update_chars") + +func _send_chat(arguments): + if !("name" in arguments): + arguments["name"]=connected_players[arguments["id"]][0] + print_line(arguments["name"]+ ": " + arguments["msg"]) + world.rpc("game_chat_msg", arguments["name"]+ ": " + arguments["msg"]) -- cgit v1.2.3