4 "github.com/dragonfireclient/hydra-dragonfire/convert"
5 "github.com/dragonfireclient/mt"
6 "github.com/yuin/gopher-lua"
12 pathNodes map[[3]int16]*PathNode
18 blocks map[[3]int16]*MapBlk
19 userdata *lua.LUserData
22 var mapFuncs = map[string]lua.LGFunction{
28 func getMap(l *lua.LState, idx int) *Map {
29 return l.CheckUserData(idx).Value.(*Map)
32 func newMap(l *lua.LState) *Map {
34 mp.blocks = map[[3]int16]*MapBlk{}
35 mp.userdata = l.NewUserData()
36 mp.userdata.Value = mp
37 l.SetMetatable(mp.userdata, l.GetTypeMetatable("hydra.map"))
41 func (mp *Map) process(client *Client, pkt *mt.Pkt) {
42 switch cmd := pkt.Cmd.(type) {
43 case *mt.ToCltBlkData:
51 if oldblk, ok := mp.blocks[cmd.Blkpos]; ok {
52 pathRemoveBlock(oldblk)
55 pathAddBlock(mp, blk, cmd.Blkpos)
58 mp.blocks[cmd.Blkpos] = blk
60 client.conn.SendCmd(&mt.ToSrvGotBlks{Blks: [][3]int16{cmd.Blkpos}})
64 func l_map(l *lua.LState) int {
66 mp.pathfind = l.ToBool(1)
71 func l_map_block(l *lua.LState) int {
74 convert.ReadVec3Int16(l, l.Get(2), &blkpos)
79 blk, ok := mp.blocks[blkpos]
81 l.Push(convert.PushMapBlk(l, *blk.data))
89 func l_map_node(l *lua.LState) int {
93 convert.ReadVec3Int16(l, l.Get(2), &pos)
94 blkpos, i := mt.Pos2Blkpos(pos)
99 blk, blk_ok := mp.blocks[blkpos]
101 meta, meta_ok := blk.data.NodeMetas[i]
103 meta = &mt.NodeMeta{}
106 lnode := l.NewTable()
107 l.SetField(lnode, "param0", lua.LNumber(blk.data.Param0[i]))
108 l.SetField(lnode, "param1", lua.LNumber(blk.data.Param1[i]))
109 l.SetField(lnode, "param2", lua.LNumber(blk.data.Param2[i]))
110 l.SetField(lnode, "meta", convert.PushNodeMeta(l, *meta))
119 func l_map_path(l *lua.LState) int {
122 panic("map not configured to support path finding")
125 var src, dst [3]int16
126 convert.ReadVec3Int16(l, l.Get(2), &src)
127 convert.ReadVec3Int16(l, l.Get(3), &dst)
132 l.Push(pathFind(mp, [2][3]int16{src, dst}, l))