summaryrefslogtreecommitdiff
path: root/server/server.lua
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.lua')
-rw-r--r--server/server.lua40
1 files changed, 25 insertions, 15 deletions
diff --git a/server/server.lua b/server/server.lua
index a53d9a1..05549bd 100644
--- a/server/server.lua
+++ b/server/server.lua
@@ -20,9 +20,9 @@ local chunks = common.ChunkMap()
local Chunk = class()
function Chunk.make(cls, cp, d) local self = setmetatable({cp=cp,d=d},cls)
chunks:add(cp,self) return self end
-function Chunk.generate(cls,cp)
+function Chunk.generate(cls,cp) local offs=cp*SIZE
local d={} for x=0,SIZE-1 do for y=0,SIZE-1 do
- local nv = noise_gen:at(x,y) local fill = nv>0.06
+ local nv = noise_gen:at(offs.x+x,offs.y+y) local fill = nv>0.06
if math.random(3) == 2 then fill = not fill end
d[1+x*SIZE+y] = (cp.x<0) ~= fill end end
return cls(cp,d) end
@@ -41,9 +41,11 @@ function Chunk.obtain(cls,cp)
return cls:generate(cp) end
local Player = class()
-function Player.make(cls, obj) return setmetatable(obj,cls) end
+function Player.make(cls, peer, j)
+ return setmetatable({peer=peer, pos=Pos(0,0), name=j.name,
+ color=j.color, loaded={}}, cls) end
function Player.packet(self,packet_type)
- return json.encode { name=self.name, pos=self.pos, type=packet_type } end
+ return json.encode { name=self.name, pos=self.pos, color=self.color, type=packet_type } end
local players = {}
local function find_player(arg) local k,v = next(arg)
for pl in pairs(players) do if pl[k] == v then return pl end end end
@@ -52,8 +54,16 @@ local function send_others(player,data)
data.from = player.name local packet = json.encode(data)
for player2 in other_players(player) do player2.peer:send(packet) end end
+local function check(peer,j) -- new player
+ if not j.name or #j.name == 0 then return "please enter a name!" end
+ if #j.name >16 then return "name too long!" end
+ if find_player{name=j.name} then return "name already in use! pick a different one!" end
+end
+
local function greet(player)
print('greeting',player.name,player.peer)
+ players[player] = true
+ player.peer:send(player:packet'you')
for player2 in other_players(player) do
player.peer:send(player2:packet'player')
player2.peer:send(player:packet'player') end end
@@ -73,22 +83,22 @@ local function doctor_chunks()
for k,chunk in pairs(chunks.d) do local cp = Pos:unkey(k)
local used = false
for player in pairs(players) do if player.loaded[k] then used=true end end
- if not used then chunk:save() chunks:remove(cp) end end end
+ if not used then chunk:save() chunks:remove(cp) end end
+ if not next(chunks.d) then print'no chunks' end end
while true do
- local ev = host:service(100) if ev then
+ local ev = host:service(10000) if ev then
local peer = ev.peer local player = find_player{peer=peer}
- if ev.type=='connect' then
- print('connecting',peer)
- local player = Player{pos=Pos(0,0), peer=peer, name=next_name(), loaded={}}
- players[player] = true; greet(player)
- elseif ev.type=='disconnect' then
- print('disconnecting',peer)
- send_others(player, {type='unplayer'})
- players[player] = nil
+ if ev.type=='connect' then print('connecting',peer)
+ elseif ev.type=='disconnect' then print('disconnecting',peer)
+ if player then send_others(player, {type='unplayer'})
+ players[player] = nil end
elseif ev.type=='receive' then local j = json.decode(ev.data)
local pos if j.pos then pos = Pos(j.pos.x,j.pos.y) end
- if j.type == 'move' then player.pos=pos send_others(player, j)
+ if j.type == 'hi' and not player then local err = check(peer,j)
+ if err then peer:send(json.encode{type="error",msg=err}) peer:disconnect_later()
+ else greet(Player(peer,j)) end
+ elseif j.type == 'move' then player.pos=pos send_others(player, j)
elseif j.type == 'tile' then chunks:set_tile(pos,j.tile) send_others(player,j)
end
end