+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
+}