summaryrefslogtreecommitdiff
path: root/scripts/Server.gd
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2022-08-31 00:26:34 -0700
committerAnson Bridges <bridges.anson@gmail.com>2022-08-31 00:26:34 -0700
commitd3998186c9795f2a85148cd5bcfa1bd5b6226cfb (patch)
treeba5cae524562818ee38da48dd09b0b42a733e1d8 /scripts/Server.gd
Initialize repo
Diffstat (limited to 'scripts/Server.gd')
-rw-r--r--scripts/Server.gd110
1 files changed, 110 insertions, 0 deletions
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"])