1function server_load()
2	SERVER = true
3	message("===SERVER===")
4	server_createserver()
5	message("Server started.")
6	updatetimer = 0
7	players = 2
8	server_controls()
9	netplay = true
10end
11
12function server_controls()
13	mouseowner = 1
14
15	controls = {}
16
17	local i = 1
18	controls[i] = {}
19	controls[i]["right"] = {"d"}
20	controls[i]["left"] = {"a"}
21	controls[i]["down"] = {"s"}
22	controls[i]["run"] = {"lshift"}
23	controls[i]["jump"] = {" "}
24	controls[i]["aimX"] = {} --mouse aiming, so no need
25	controls[i]["aimY"] = {}
26	controls[i]["portal1"] = {}
27	controls[i]["portal2"] = {}
28	controls[i]["reload"] = {"r"}
29	controls[i]["use"] = {"e"}
30
31	local i = 2 --unbind Player 2
32	controls[i] = {}
33	controls[i]["right"] = {""}
34	controls[i]["left"] = {""}
35	controls[i]["down"] = {""}
36	controls[i]["run"] = {""}
37	controls[i]["jump"] = {""}
38	controls[i]["aimX"] = {}
39	controls[i]["aimY"] = {}
40	controls[i]["portal1"] = {}
41	controls[i]["portal2"] = {}
42	controls[i]["reload"] = {""}
43	controls[i]["use"] = {""}
44end
45
46function server_createserver()
47	SERVER = true
48	MyServer = lube.server(port)
49	MyServer:setCallback(umsg.recv,server_connect,server_disconnect)
50	MyServer:setHandshake("bj")
51	MyServer:setPing(true, 5, "PING")
52
53	umsg.hook( "playerlistrequest", server_playerlistrequest)
54	umsg.hook( "nickname", server_nicknameget)
55	umsg.hook( "server_synctest", server_synctest)
56	umsg.hook( "shootportal", server_shootportal)
57end
58
59function server_update(dt)
60	MyServer:update(dt)
61
62	updatetimer = updatetimer + dt
63	if updatetimer > updatedelay then
64		if objects then
65			local s = "ndummy~1"
66			for i, v in pairs(objects["player"][1]) do
67				if type(v) == "table" then
68
69				elseif type(v) == "number" then
70					s = s .. "~n" .. i .. "~" .. tostring(v)
71
72				elseif type(v) == "string" then
73					s = s .. "~s" .. i .. "~" .. tostring(v)
74
75				elseif type(v) == "boolean" then
76					s = s .. "~b" .. i .. "~" .. tostring(v)
77				else
78					s = s .. "~" .. i .. "~" .. tostring(v)
79				end
80			end
81			local um = usermessage:new("client_synctest", s)
82			um:send()
83		end
84
85		updatetimer = 0
86	end
87end
88
89function server_shootportal(args)
90	args = args:split("~")
91	message("Player 2 shot portal #" .. args[1])
92	shootportal(2, tonumber(args[1]), tonumber(args[2]), tonumber(args[3]), tonumber(args[4]))
93end
94
95function server_synctest(input)
96	if objects then
97		des = deserialize(input)
98		for i = 1, #des, 2 do
99			local t = string.sub(des[i], 1, 1)
100			local varname = string.sub(des[i], 2, string.len(des[i]))
101			local varvalue = des[i+1]
102			if t == "b" then
103				if varvalue == "true" then
104					objects["player"][2][varname] = true
105				else
106					objects["player"][2][varname] = false
107				end
108			elseif t == "s" then
109				objects["player"][2][varname] = varvalue
110			elseif t == "n" then
111				objects["player"][2][varname] = tonumber(varvalue)
112			end
113		end
114	end
115end
116
117function server_connect(id)
118	message("New client connected: " .. id)
119	local um = usermessage:new("client_connectconfirm", motd)
120	um:send(id)
121end
122
123function server_playerlistrequest(data, id)
124	output = playerlist[1]
125	for i = 1, #playerlist do
126		output = output .. "~" .. playerlist[i]
127	end
128
129	local um = usermessage:new("client_playerlistget", output)
130	um:send(id)
131end
132
133function server_nicknameget(data, id)
134	playerlist[id] = tostring(data)
135	message("Received player " .. id .. "'s nickname: " .. tostring(data))
136end
137
138function server_disconnect(id)
139	table.remove(playerlist, id)
140	message("Client disconnect: " .. id)
141end
142
143function server_start()
144	message("Starting the game!")
145	for i = 1, #playerlist do
146		local um = usermessage:new("client_start", players .. "~" .. i+1)
147		um:send()
148	end
149	game_load()
150end
151
152function server_quit()
153
154end