)
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 getMap(l *lua.LState, idx int) *Map {
+ return l.CheckUserData(idx).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 newMap(l *lua.LState) *Map {
+ mp := &Map{}
+ mp.blocks = map[[3]int16]*mt.MapBlk{}
+ mp.userdata = l.NewUserData()
+ mp.userdata.Value = mp
+ l.SetMetatable(mp.userdata, l.GetTypeMetatable("hydra.map"))
+ return mp
}
-func (mtmap *Map) push() lua.LValue {
- return mtmap.userdata
-}
-
-func (mtmap *Map) connect() {
-}
-
-func (mtmap *Map) process(pkt *mt.Pkt) {
+func (mp *Map) process(client *Client, 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()
+ mp.mu.Lock()
+ mp.blocks[cmd.Blkpos] = &cmd.Blk
+ mp.mu.Unlock()
+ client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}})
}
}
-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(l *lua.LState) int {
+ mp := newMap(l)
+ l.Push(mp.userdata)
+ return 1
}
func l_map_block(l *lua.LState) int {
- mtmap := getMap(l)
+ mp := getMap(l, 1)
var blkpos [3]int16
convert.ReadVec3Int16(l, l.Get(2), &blkpos)
- mtmap.mu.Lock()
- defer mtmap.mu.Unlock()
+ mp.mu.Lock()
+ defer mp.mu.Unlock()
- block, ok := mtmap.blocks[blkpos]
+ block, ok := mp.blocks[blkpos]
if ok {
l.Push(convert.PushMapBlk(l, *block))
} else {
}
func l_map_node(l *lua.LState) int {
- mtmap := getMap(l)
+ mp := getMap(l, 1)
var pos [3]int16
convert.ReadVec3Int16(l, l.Get(2), &pos)
blkpos, i := mt.Pos2Blkpos(pos)
- mtmap.mu.Lock()
- defer mtmap.mu.Unlock()
+ mp.mu.Lock()
+ defer mp.mu.Unlock()
- block, block_exists := mtmap.blocks[blkpos]
+ block, block_exists := mp.blocks[blkpos]
if block_exists {
meta, meta_exists := block.NodeMetas[i]
if !meta_exists {