]> git.lizzy.rs Git - hydra-dragonfire.git/blobdiff - map.go
Allow multiple clients to share a map
[hydra-dragonfire.git] / map.go
diff --git a/map.go b/map.go
index 08b97ec1bef9eb736078292c6cc8a329b9c2d59c..1ffae233dc6940a63cf58c1ca343261bc845c464 100644 (file)
--- a/map.go
+++ b/map.go
@@ -8,74 +8,54 @@ import (
 )
 
 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 {
@@ -86,16 +66,16 @@ func l_map_block(l *lua.LState) int {
 }
 
 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 {