local network = require("client") require("client.world") function move(player, x, y) local dir = strvec_to_intvec(x,y) player.x = dir.x player.y = dir.y end function dir_to_vec(dir) if dir == "up" then return vec(0,-1) elseif dir == "down" then return vec(0,1) elseif dir == "left" then return vec(-1,0) elseif dir == "right" then return vec(1,0) else return vec(0,0) end end function strvec_to_intvec(x,y) return vec(tonumber(x), tonumber(y)) end function love.load() network.connect("127.0.0.1", 9000) network.on(network.MSG_ON_CONNECT, function(payload) print("connected to server with id " .. payload) add_player(payload) if client_id == 0 then client_id = payload end end) network.on(network.MSG_GAMESTATE, function(payload) local cmds = read_command(payload) act_on_command(cmds) end) network.on(network.MSG_ON_PLAYER_CONNECT, function(payload) if payload == client_id then return end add_player(payload) for i, v in pairs(world.entities.players) do network.sendPacket(network.MSG_KEY_PRESS, "player/" .. v.client_id .. "/moved/" .. v.x .. "/".. v.y) end end) end function add_player(id) local new_player = { x = 0, y = 0, sprite = 0, client_id = id } world.entities.players[new_player.client_id] = new_player return new_player end function love.keypressed(key) local dir if key == "w" then dir = vec(0,-world.cell_size) elseif key == "a" then dir = vec(-world.cell_size,0) elseif key == "s" then dir = vec(0,world.cell_size) elseif key == "d" then dir = vec(world.cell_size,0) else dir = "right" end network.sendPacket(network.MSG_KEY_PRESS, "player/" .. client_id .. "/moved/" .. world.entities.players[client_id].x + dir.x .. "/".. world.entities.players[client_id].y + dir.y) end function love.update() network.update() end function love.draw() for i, v in pairs(world.entities.players) do love.graphics.rectangle("fill", v.x, v.y, world.cell_size, world.cell_size) love.graphics.print(v.client_id, v.x, v.y - world.cell_size - 5) end end function read_command(payload) local cmds = {} local num_cmds = 1 local s = "" for i in string.gmatch(payload, ".") do if i ~= "/" then s = s .. i else cmds[num_cmds] = s s = "" num_cmds = num_cmds + 1 end end cmds[num_cmds] = s return cmds end function act_on_command(cmds) if cmds[1] == "player" then -- do player sync for i, v in pairs(world.entities.players) do if v.client_id == cmds[2] then if cmds[3] == "moved" then local player = world.entities.players[cmds[2]] move(player, tonumber(cmds[4]),tonumber(cmds[5])) end end if world.entities.players[cmds[2]] == nil then print("adding player") add_player(cmds[2]) end end end end