diff options
Diffstat (limited to 'map.go')
-rw-r--r-- | map.go | 116 |
1 files changed, 116 insertions, 0 deletions
@@ -0,0 +1,116 @@ +package main + +import ( + "github.com/anon55555/mt" + "github.com/dragonfireclient/hydra-dragonfire/convert" + "github.com/yuin/gopher-lua" + "sync" +) + +type Map struct { + client *Client + mu sync.Mutex + blocks map[[3]int16]*mt.MapBlk + userdata *lua.LUserData +} + +var mapFuncs = map[string]lua.LGFunction{ + "clear": l_map_clear, + "block": l_map_block, + "node": l_map_node, +} + +func getMap(l *lua.LState) *Map { + return l.CheckUserData(1).Value.(*Map) +} + +func (mtmap *Map) create(client *Client, l *lua.LState) { + mtmap.client = client + mtmap.blocks = map[[3]int16]*mt.MapBlk{} + mtmap.userdata = l.NewUserData() + mtmap.userdata.Value = mtmap + l.SetMetatable(mtmap.userdata, l.GetTypeMetatable("hydra.map")) +} + +func (mtmap *Map) push() lua.LValue { + return mtmap.userdata +} + +func (mtmap *Map) connect() { +} + +func (mtmap *Map) process(pkt *mt.Pkt) { + switch cmd := pkt.Cmd.(type) { + case *mt.ToCltBlkData: + mtmap.mu.Lock() + mtmap.blocks[cmd.Blkpos] = &cmd.Blk + mtmap.client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}}) + mtmap.mu.Unlock() + } +} + +func l_map_clear(l *lua.LState) int { + mtmap := getMap(l) + + mtmap.mu.Lock() + defer mtmap.mu.Unlock() + + var cmd mt.ToSrvDeletedBlks + for pos := range mtmap.blocks { + cmd.Blks = append(cmd.Blks, pos) + } + + mtmap.blocks = map[[3]int16]*mt.MapBlk{} + + mtmap.client.conn.SendCmd(&cmd) + + return 0 +} + +func l_map_block(l *lua.LState) int { + mtmap := getMap(l) + var blkpos [3]int16 + convert.ReadVec3Int16(l, l.Get(2), &blkpos) + + mtmap.mu.Lock() + defer mtmap.mu.Unlock() + + block, ok := mtmap.blocks[blkpos] + if ok { + l.Push(convert.PushMapBlk(l, *block)) + } else { + l.Push(lua.LNil) + } + + return 1 +} + +func l_map_node(l *lua.LState) int { + mtmap := getMap(l) + + var pos [3]int16 + convert.ReadVec3Int16(l, l.Get(2), &pos) + blkpos, i := mt.Pos2Blkpos(pos) + + mtmap.mu.Lock() + defer mtmap.mu.Unlock() + + block, block_exists := mtmap.blocks[blkpos] + if block_exists { + meta, meta_exists := block.NodeMetas[i] + if !meta_exists { + 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, "meta", convert.PushNodeMeta(l, *meta)) + l.Push(lnode) + } else { + l.Push(lua.LNil) + } + + return 1 +} |