local enet = require"enet" local json = require"common.dkjson" local Chunk = require"common.chunk".Chunk local unpack = unpack or table.unpack math.randomseed(os.time()) local host = enet.host_create("*:8473") print(host:get_socket_address()) -- sequential list of all players local playerlist = {} local nextid = 1 -- this is maybe suboptimal -- but it is simplest for now local function player_by_id(id) for i,pl in ipairs(playerlist) do if pl.id == id then return pl, i end end return nil end local function player_by_peer(peer) for i,pl in ipairs(playerlist) do if pl.peer == peer then return pl, i end end return nil end local function random_color() return {math.random(),math.random(),math.random()} end local function make_player(peer) local p = {pos={0,0},color=random_color(),peer=peer,id=nextid} nextid = nextid + 1 return p end local function player_info_part(player) return { id=player.id, x=player.pos[1], y=player.pos[2], color=player.color, } end local function player_join_packet(player) return json.encode{t="join",pl=player_info_part(player)} end local function player_you_packet(player) return json.encode{t="you",pl=player_info_part(player)} end local function player_leave_packet(player) return json.encode{t="leave",id=player.id} end local function player_move_packet(player,x,y) return json.encode{t="move",id=player.id,x=x,y=y} end local the_chunk = Chunk.gen() while true do local ev = host:service(100) if ev then if ev.type == "connect" then local player = make_player(ev.peer) table.insert(playerlist,player) print("connect",player.peer,player.id) player.peer:send(player_you_packet(player)) player.peer:send(the_chunk:data_packet()) for i,otherplayer in ipairs(playerlist) do if otherplayer ~= player then -- tell new player about each other player player.peer:send(player_join_packet(otherplayer)) -- tell each other player about new player otherplayer.peer:send(player_join_packet(player)) end end elseif ev.type == "disconnect" then local player, idx = player_by_peer(ev.peer) if not player then error("sneeze "..ev.peer) end print("disconnect",player.peer,player.id) table.remove(playerlist,idx) for i,otherplayer in ipairs(playerlist) do otherplayer.peer:send(player_leave_packet(player)) end elseif ev.type == "receive" then local player = player_by_peer(ev.peer) if not player then error("sneezey "..ev.peer) end local j = json.decode(ev.data) local op = j.t if op == "ppos" then local x,y = j.x,j.y player.pos[1] = x player.pos[2] = y print(player.id,"-->",player.pos[1],player.pos[2]) for i,otherplayer in ipairs(playerlist) do if otherplayer ~= player then otherplayer.peer:send(player_move_packet(player,x,y)) end end end end -- for k,v in pairs(ev) do io.write(tostring(k),":",tostring(v)," ") end -- print() end end