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