1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
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):
if output == null:
print("SERVER: " + line)
return
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, tree, 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)
tree.get_root().add_child(world)
world.client_id = 1
server_enet = NetworkedMultiplayerENet.new()
server_enet.create_server(port, max_players)
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):
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"])
|