]> git.lizzy.rs Git - hydra-dragonfire.git/blob - map.go
Add map component
[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         client   *Client
12         mu       sync.Mutex
13         blocks   map[[3]int16]*mt.MapBlk
14         userdata *lua.LUserData
15 }
16
17 var mapFuncs = map[string]lua.LGFunction{
18         "clear": l_map_clear,
19         "block": l_map_block,
20         "node":  l_map_node,
21 }
22
23 func getMap(l *lua.LState) *Map {
24         return l.CheckUserData(1).Value.(*Map)
25 }
26
27 func (mtmap *Map) create(client *Client, l *lua.LState) {
28         mtmap.client = client
29         mtmap.blocks = map[[3]int16]*mt.MapBlk{}
30         mtmap.userdata = l.NewUserData()
31         mtmap.userdata.Value = mtmap
32         l.SetMetatable(mtmap.userdata, l.GetTypeMetatable("hydra.map"))
33 }
34
35 func (mtmap *Map) push() lua.LValue {
36         return mtmap.userdata
37 }
38
39 func (mtmap *Map) connect() {
40 }
41
42 func (mtmap *Map) process(pkt *mt.Pkt) {
43         switch cmd := pkt.Cmd.(type) {
44         case *mt.ToCltBlkData:
45                 mtmap.mu.Lock()
46                 mtmap.blocks[cmd.Blkpos] = &cmd.Blk
47                 mtmap.client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}})
48                 mtmap.mu.Unlock()
49         }
50 }
51
52 func l_map_clear(l *lua.LState) int {
53         mtmap := getMap(l)
54
55         mtmap.mu.Lock()
56         defer mtmap.mu.Unlock()
57
58         var cmd mt.ToSrvDeletedBlks
59         for pos := range mtmap.blocks {
60                 cmd.Blks = append(cmd.Blks, pos)
61         }
62
63         mtmap.blocks = map[[3]int16]*mt.MapBlk{}
64
65         mtmap.client.conn.SendCmd(&cmd)
66
67         return 0
68 }
69
70 func l_map_block(l *lua.LState) int {
71         mtmap := getMap(l)
72         var blkpos [3]int16
73         convert.ReadVec3Int16(l, l.Get(2), &blkpos)
74
75         mtmap.mu.Lock()
76         defer mtmap.mu.Unlock()
77
78         block, ok := mtmap.blocks[blkpos]
79         if ok {
80                 l.Push(convert.PushMapBlk(l, *block))
81         } else {
82                 l.Push(lua.LNil)
83         }
84
85         return 1
86 }
87
88 func l_map_node(l *lua.LState) int {
89         mtmap := getMap(l)
90
91         var pos [3]int16
92         convert.ReadVec3Int16(l, l.Get(2), &pos)
93         blkpos, i := mt.Pos2Blkpos(pos)
94
95         mtmap.mu.Lock()
96         defer mtmap.mu.Unlock()
97
98         block, block_exists := mtmap.blocks[blkpos]
99         if block_exists {
100                 meta, meta_exists := block.NodeMetas[i]
101                 if !meta_exists {
102                         meta = &mt.NodeMeta{}
103                 }
104
105                 lnode := l.NewTable()
106                 l.SetField(lnode, "param0", lua.LNumber(block.Param0[i]))
107                 l.SetField(lnode, "param1", lua.LNumber(block.Param1[i]))
108                 l.SetField(lnode, "param2", lua.LNumber(block.Param2[i]))
109                 l.SetField(lnode, "meta", convert.PushNodeMeta(l, *meta))
110                 l.Push(lnode)
111         } else {
112                 l.Push(lua.LNil)
113         }
114
115         return 1
116 }