]> git.lizzy.rs Git - hydra-dragonfire.git/blob - map.go
1ffae233dc6940a63cf58c1ca343261bc845c464
[hydra-dragonfire.git] / map.go
1 package main
2
3 import (
4         "github.com/anon55555/mt"
5         "github.com/dragonfireclient/hydra-dragonfire/convert"
6         "github.com/yuin/gopher-lua"
7         "sync"
8 )
9
10 type Map struct {
11         mu       sync.Mutex
12         blocks   map[[3]int16]*mt.MapBlk
13         userdata *lua.LUserData
14 }
15
16 var mapFuncs = map[string]lua.LGFunction{
17         "block": l_map_block,
18         "node":  l_map_node,
19 }
20
21 func getMap(l *lua.LState, idx int) *Map {
22         return l.CheckUserData(idx).Value.(*Map)
23 }
24
25 func newMap(l *lua.LState) *Map {
26         mp := &Map{}
27         mp.blocks = map[[3]int16]*mt.MapBlk{}
28         mp.userdata = l.NewUserData()
29         mp.userdata.Value = mp
30         l.SetMetatable(mp.userdata, l.GetTypeMetatable("hydra.map"))
31         return mp
32 }
33
34 func (mp *Map) process(client *Client, pkt *mt.Pkt) {
35         switch cmd := pkt.Cmd.(type) {
36         case *mt.ToCltBlkData:
37                 mp.mu.Lock()
38                 mp.blocks[cmd.Blkpos] = &cmd.Blk
39                 mp.mu.Unlock()
40                 client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}})
41         }
42 }
43
44 func l_map(l *lua.LState) int {
45         mp := newMap(l)
46         l.Push(mp.userdata)
47         return 1
48 }
49
50 func l_map_block(l *lua.LState) int {
51         mp := getMap(l, 1)
52         var blkpos [3]int16
53         convert.ReadVec3Int16(l, l.Get(2), &blkpos)
54
55         mp.mu.Lock()
56         defer mp.mu.Unlock()
57
58         block, ok := mp.blocks[blkpos]
59         if ok {
60                 l.Push(convert.PushMapBlk(l, *block))
61         } else {
62                 l.Push(lua.LNil)
63         }
64
65         return 1
66 }
67
68 func l_map_node(l *lua.LState) int {
69         mp := getMap(l, 1)
70
71         var pos [3]int16
72         convert.ReadVec3Int16(l, l.Get(2), &pos)
73         blkpos, i := mt.Pos2Blkpos(pos)
74
75         mp.mu.Lock()
76         defer mp.mu.Unlock()
77
78         block, block_exists := mp.blocks[blkpos]
79         if block_exists {
80                 meta, meta_exists := block.NodeMetas[i]
81                 if !meta_exists {
82                         meta = &mt.NodeMeta{}
83                 }
84
85                 lnode := l.NewTable()
86                 l.SetField(lnode, "param0", lua.LNumber(block.Param0[i]))
87                 l.SetField(lnode, "param1", lua.LNumber(block.Param1[i]))
88                 l.SetField(lnode, "param2", lua.LNumber(block.Param2[i]))
89                 l.SetField(lnode, "meta", convert.PushNodeMeta(l, *meta))
90                 l.Push(lnode)
91         } else {
92                 l.Push(lua.LNil)
93         }
94
95         return 1
96 }