diff options
Diffstat (limited to 'map.go')
-rw-r--r-- | map.go | 45 |
1 files changed, 31 insertions, 14 deletions
@@ -7,9 +7,15 @@ import ( "sync" ) +type MapBlk struct { + data *mt.MapBlk + edges [6]*PathfindEdge +} + type Map struct { mu sync.Mutex - blocks map[[3]int16]*mt.MapBlk + pathfind bool + blocks map[[3]int16]*MapBlk userdata *lua.LUserData } @@ -24,7 +30,7 @@ func getMap(l *lua.LState, idx int) *Map { func newMap(l *lua.LState) *Map { mp := &Map{} - mp.blocks = map[[3]int16]*mt.MapBlk{} + mp.blocks = map[[3]int16]*MapBlk{} mp.userdata = l.NewUserData() mp.userdata.Value = mp l.SetMetatable(mp.userdata, l.GetTypeMetatable("hydra.map")) @@ -34,15 +40,26 @@ func newMap(l *lua.LState) *Map { func (mp *Map) process(client *Client, pkt *mt.Pkt) { switch cmd := pkt.Cmd.(type) { case *mt.ToCltBlkData: - mp.mu.Lock() - mp.blocks[cmd.Blkpos] = &cmd.Blk - mp.mu.Unlock() + go func() { + mp.mu.Lock() + defer mp.mu.Unlock() + + blk := &MapBlk{} + blk.data = &cmd.Blk + if mp.pathfind { + pfPreprocess(mp, cmd.Blkpos, blk) + } + + mp.blocks[cmd.Blkpos] = blk + }() + client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}}) } } func l_map(l *lua.LState) int { mp := newMap(l) + mp.pathfind = l.ToBool(1) l.Push(mp.userdata) return 1 } @@ -55,9 +72,9 @@ func l_map_block(l *lua.LState) int { mp.mu.Lock() defer mp.mu.Unlock() - block, ok := mp.blocks[blkpos] + blk, ok := mp.blocks[blkpos] if ok { - l.Push(convert.PushMapBlk(l, *block)) + l.Push(convert.PushMapBlk(l, *blk.data)) } else { l.Push(lua.LNil) } @@ -75,17 +92,17 @@ func l_map_node(l *lua.LState) int { mp.mu.Lock() defer mp.mu.Unlock() - block, block_exists := mp.blocks[blkpos] - if block_exists { - meta, meta_exists := block.NodeMetas[i] - if !meta_exists { + blk, blk_ok := mp.blocks[blkpos] + if blk_ok { + meta, meta_ok := blk.data.NodeMetas[i] + if !meta_ok { meta = &mt.NodeMeta{} } lnode := l.NewTable() - l.SetField(lnode, "param0", lua.LNumber(block.Param0[i])) - l.SetField(lnode, "param1", lua.LNumber(block.Param1[i])) - l.SetField(lnode, "param2", lua.LNumber(block.Param2[i])) + l.SetField(lnode, "param0", lua.LNumber(blk.data.Param0[i])) + l.SetField(lnode, "param1", lua.LNumber(blk.data.Param1[i])) + l.SetField(lnode, "param2", lua.LNumber(blk.data.Param2[i])) l.SetField(lnode, "meta", convert.PushNodeMeta(l, *meta)) l.Push(lnode) } else { |