mapserver/server/mapblockparser/mapblock.go
NatureFreshMilk f132363342 poi impl
2019-01-24 13:55:29 +01:00

92 lines
2.0 KiB
Go

package mapblockparser
import (
"mapserver/coords"
)
type MapBlock struct {
Pos coords.MapBlockCoords `json:"pos"`
Size int `json:"size"`
Version byte `json:"version"`
Underground bool `json:"underground"`
Mapdata []byte `json:"mapdata"`
Metadata *Metadata `json:"metadata"`
BlockMapping map[int]string `json:"blockmapping"`
Mtime int64 `json:"mtime"`
}
type Metadata struct {
Inventories map[int]map[string]*Inventory `json:"inventories"`
Pairs map[int]map[string]string `json:"pairs"`
}
type Item struct {
Name string `json:"name"`
Count int `json:"count"`
Wear int `json:"wear"`
}
type Inventory struct {
Size int `json:"size"`
Items []Item `json:"items"`
}
func getNodePos(x, y, z int) int {
return x + (y * 16) + (z * 256)
}
func (mb *MapBlock) GetNodeName(x, y, z int) string {
pos := getNodePos(x, y, z)
id := readU16(mb.Mapdata, pos*2)
return mb.BlockMapping[id]
}
func NewMapblock() *MapBlock {
mb := MapBlock{}
mb.Metadata = NewMetadata()
mb.BlockMapping = make(map[int]string)
return &mb
}
func NewMetadata() *Metadata {
md := Metadata{}
md.Inventories = make(map[int]map[string]*Inventory)
md.Pairs = make(map[int]map[string]string)
return &md
}
func (md *Metadata) GetMetadata(x, y, z int) map[string]string {
return md.GetPairsMap(getNodePos(x, y, z))
}
func (md *Metadata) GetPairsMap(pos int) map[string]string {
pairsMap := md.Pairs[pos]
if pairsMap == nil {
pairsMap = make(map[string]string)
md.Pairs[pos] = pairsMap
}
return pairsMap
}
func (md *Metadata) GetInventoryMap(pos int) map[string]*Inventory {
invMap := md.Inventories[pos]
if invMap == nil {
invMap = make(map[string]*Inventory)
md.Inventories[pos] = invMap
}
return invMap
}
func (md *Metadata) GetInventory(pos int, name string) *Inventory {
m := md.GetInventoryMap(pos)
inv := m[name]
if inv == nil {
inv = &Inventory{}
m[name] = inv
}
return inv
}