2019-01-06 23:00:24 +03:00
|
|
|
package mapblockparser
|
|
|
|
|
2019-01-21 13:31:50 +03:00
|
|
|
import (
|
|
|
|
"mapserver/coords"
|
|
|
|
)
|
|
|
|
|
2019-01-06 23:00:24 +03:00
|
|
|
type MapBlock struct {
|
2019-02-06 10:38:08 +03:00
|
|
|
Pos *coords.MapBlockCoords `json:"pos"`
|
2019-02-07 10:02:13 +03:00
|
|
|
Size int `json:"size"`
|
|
|
|
Version byte `json:"version"`
|
|
|
|
Underground bool `json:"underground"`
|
|
|
|
Mapdata *MapData `json:"mapdata"`
|
|
|
|
Metadata *Metadata `json:"metadata"`
|
|
|
|
BlockMapping map[int]string `json:"blockmapping"`
|
|
|
|
Mtime int64 `json:"mtime"`
|
2019-01-18 13:04:37 +03:00
|
|
|
}
|
|
|
|
|
2019-01-28 13:45:23 +03:00
|
|
|
type MapData struct {
|
|
|
|
ContentId []int `json:"contentid"`
|
|
|
|
Param1 []int `json:"param1"`
|
|
|
|
Param2 []int `json:"param2"`
|
|
|
|
}
|
|
|
|
|
2019-01-18 13:04:37 +03:00
|
|
|
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"`
|
2019-02-15 13:25:49 +03:00
|
|
|
//TODO: metadata
|
|
|
|
}
|
|
|
|
|
2019-04-17 09:25:01 +03:00
|
|
|
func (this *MapBlock) IsEmpty() bool {
|
|
|
|
if len(this.BlockMapping) == 0 {
|
|
|
|
// only air
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(this.BlockMapping) == 1 {
|
|
|
|
for _, name := range this.BlockMapping {
|
|
|
|
if name == "vacuum:vacuum" {
|
|
|
|
// only vacuum
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// other stuff
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-02-15 13:25:49 +03:00
|
|
|
func (this *Item) IsEmpty() bool {
|
|
|
|
return this.Name == "" && this.Count == 0
|
2019-01-18 13:04:37 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
type Inventory struct {
|
2019-02-15 16:30:51 +03:00
|
|
|
Size int `json:"size"`
|
2019-02-15 13:25:49 +03:00
|
|
|
Items []*Item `json:"items"`
|
2019-01-07 10:59:06 +03:00
|
|
|
}
|
|
|
|
|
2019-01-13 18:37:03 +03:00
|
|
|
func getNodePos(x, y, z int) int {
|
2019-01-10 18:04:20 +03:00
|
|
|
return x + (y * 16) + (z * 256)
|
|
|
|
}
|
|
|
|
|
2019-02-08 13:45:56 +03:00
|
|
|
func (inv *Inventory) IsEmpty() bool {
|
|
|
|
if inv.Size == 0 || len(inv.Items) == 0 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, item := range inv.Items {
|
|
|
|
if item.Name != "" && item.Count > 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2019-01-28 16:19:11 +03:00
|
|
|
func (mb *MapBlock) GetNodeId(x, y, z int) int {
|
2019-01-13 18:37:03 +03:00
|
|
|
pos := getNodePos(x, y, z)
|
2019-01-28 16:19:11 +03:00
|
|
|
return mb.Mapdata.ContentId[pos]
|
|
|
|
}
|
|
|
|
|
2019-06-19 22:12:04 +03:00
|
|
|
func (mb *MapBlock) GetParam2(x, y, z int) int {
|
|
|
|
pos := getNodePos(x, y, z)
|
|
|
|
return mb.Mapdata.Param2[pos]
|
|
|
|
}
|
|
|
|
|
2019-01-28 16:19:11 +03:00
|
|
|
func (mb *MapBlock) GetNodeName(x, y, z int) string {
|
2019-01-28 16:33:32 +03:00
|
|
|
id := mb.GetNodeId(x, y, z)
|
2019-01-10 18:04:20 +03:00
|
|
|
return mb.BlockMapping[id]
|
|
|
|
}
|
|
|
|
|
2019-01-22 15:17:30 +03:00
|
|
|
func NewMapblock() *MapBlock {
|
2019-01-07 21:38:53 +03:00
|
|
|
mb := MapBlock{}
|
|
|
|
mb.Metadata = NewMetadata()
|
2019-01-07 21:53:05 +03:00
|
|
|
mb.BlockMapping = make(map[int]string)
|
2019-01-22 15:17:30 +03:00
|
|
|
return &mb
|
2019-01-07 21:38:53 +03:00
|
|
|
}
|
2019-01-07 10:59:06 +03:00
|
|
|
|
2019-01-21 16:47:57 +03:00
|
|
|
func NewMetadata() *Metadata {
|
2019-01-07 21:38:53 +03:00
|
|
|
md := Metadata{}
|
|
|
|
md.Inventories = make(map[int]map[string]*Inventory)
|
|
|
|
md.Pairs = make(map[int]map[string]string)
|
2019-01-21 16:47:57 +03:00
|
|
|
return &md
|
2019-01-07 21:38:53 +03:00
|
|
|
}
|
2019-01-07 18:06:03 +03:00
|
|
|
|
2019-01-24 15:55:29 +03:00
|
|
|
func (md *Metadata) GetMetadata(x, y, z int) map[string]string {
|
|
|
|
return md.GetPairsMap(getNodePos(x, y, z))
|
|
|
|
}
|
|
|
|
|
2019-01-07 21:38:53 +03:00
|
|
|
func (md *Metadata) GetPairsMap(pos int) map[string]string {
|
2019-01-07 18:06:03 +03:00
|
|
|
pairsMap := md.Pairs[pos]
|
|
|
|
if pairsMap == nil {
|
2019-01-07 18:35:26 +03:00
|
|
|
pairsMap = make(map[string]string)
|
2019-01-07 18:06:03 +03:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2019-02-08 13:23:04 +03:00
|
|
|
func (md *Metadata) GetInventoryMapAtPos(x, y, z int) map[string]*Inventory {
|
|
|
|
return md.GetInventoryMap(getNodePos(x, y, z))
|
|
|
|
}
|
|
|
|
|
2019-01-07 18:06:03 +03:00
|
|
|
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
|
2019-01-07 10:59:06 +03:00
|
|
|
}
|