diff options
Diffstat (limited to 'mcmap')
-rw-r--r-- | mcmap/chunk.go | 18 | ||||
-rw-r--r-- | mcmap/dims.go | 11 | ||||
-rw-r--r-- | mcmap/examples/emeraldfinder/main.go | 6 | ||||
-rw-r--r-- | mcmap/examples/mapper/main.go | 14 | ||||
-rw-r--r-- | mcmap/examples/replace/main.go | 6 | ||||
-rw-r--r-- | mcmap/prechunk.go | 34 | ||||
-rw-r--r-- | mcmap/region.go | 20 | ||||
-rw-r--r-- | mcmap/regionfile.go | 20 |
8 files changed, 70 insertions, 59 deletions
diff --git a/mcmap/chunk.go b/mcmap/chunk.go index 496fd0c..3241d82 100644 --- a/mcmap/chunk.go +++ b/mcmap/chunk.go @@ -7,7 +7,7 @@ import ( ) func calcBlockOffset(x, y, z int) int { - if (x < 0) || (y < 0) || (z < 0) || (x >= 16) || (y >= 256) || (z >= 16) { + if (x < 0) || (y < 0) || (z < 0) || (x >= ChunkSizeXZ) || (y >= ChunkSizeY) || (z >= ChunkSizeXZ) { return -1 } @@ -25,15 +25,15 @@ func offsetToPos(off int) (x, y, z int) { func BlockToChunk(bx, bz int) (cx, cz, rbx, rbz int) { cx = bx << 4 cz = bz << 4 - rbx = ((cx % 16) + 16) % 16 - rbz = ((cz % 16) + 16) % 16 + rbx = ((cx % ChunkSizeXZ) + ChunkSizeXZ) % ChunkSizeXZ + rbz = ((cz % ChunkSizeXZ) + ChunkSizeXZ) % ChunkSizeXZ return } // ChunkToBlock calculates the global position of a block, given the chunk position (cx, cz) and the plock position in that chunk (rbx, rbz). func ChunkToBlock(cx, cz, rbx, rbz int) (bx, bz int) { - bx = cx*16 + rbx - bz = cz*16 + rbz + bx = cx*ChunkSizeXZ + rbx + bz = cz*ChunkSizeXZ + rbz return } @@ -79,18 +79,18 @@ func (c *Chunk) Block(x, y, z int) *Block { // // x and z must be in [0, 15]. Height will panic, if this is violated! func (c *Chunk) Height(x, z int) int { - if (x < 0) || (x > 15) || (z < 0) || (z > 15) { + if (x < 0) || (x >= ChunkSizeXZ) || (z < 0) || (z >= ChunkSizeXZ) { panic(errors.New("x or z parameter was out of range")) } - return int(c.heightMap[z*16+x]) + return int(c.heightMap[z*ChunkSizeXZ+x]) } // Biome gets the Biome at x,z. -func (c *Chunk) Biome(x, z int) Biome { return c.biomes[x*16+z] } +func (c *Chunk) Biome(x, z int) Biome { return c.biomes[x*ChunkSizeXZ+z] } // SetBiome sets the biome at x,z. -func (c *Chunk) SetBiome(x, z int, bio Biome) { c.biomes[x*16+z] = bio } +func (c *Chunk) SetBiome(x, z int, bio Biome) { c.biomes[x*ChunkSizeXZ+z] = bio } // MarkUnused marks the chunk as unused. If all chunks of a superchunk are marked as unused, the superchunk will be unloaded and saved (if needed). // diff --git a/mcmap/dims.go b/mcmap/dims.go new file mode 100644 index 0000000..0b2bb7e --- /dev/null +++ b/mcmap/dims.go @@ -0,0 +1,11 @@ +package mcmap + +const ( + ChunkSizeXZ = 16 + ChunkSizeY = 256 + ChunkRectXZ = ChunkSizeXZ * ChunkSizeXZ + ChunkSize = ChunkRectXZ * ChunkSizeY +) + +const superchunkSizeXZ = 32 +const chunkSectionSize = ChunkRectXZ * 16 diff --git a/mcmap/examples/emeraldfinder/main.go b/mcmap/examples/emeraldfinder/main.go index d92ad3c..3249a35 100644 --- a/mcmap/examples/emeraldfinder/main.go +++ b/mcmap/examples/emeraldfinder/main.go @@ -36,9 +36,9 @@ chunkLoop: os.Exit(1) } - for y := 0; y < 256; y++ { - for x := 0; x < 16; x++ { - for z := 0; z < 16; z++ { + for y := 0; y < mcmap.ChunkSizeY; y++ { + for x := 0; x < mcmap.ChunkSizeXZ; x++ { + for z := 0; z < mcmap.ChunkSizeXZ; z++ { blk := chunk.Block(x, y, z) if blk.ID == mcmap.BlkEmeraldOre { absx, absz := mcmap.ChunkToBlock(cx, cz, x, z) diff --git a/mcmap/examples/mapper/main.go b/mcmap/examples/mapper/main.go index 2cbcefb..2b21648 100644 --- a/mcmap/examples/mapper/main.go +++ b/mcmap/examples/mapper/main.go @@ -27,8 +27,8 @@ func main() { } xmin, xmax, zmin, zmax := region.MaxDims() - w := (xmax - xmin) * 16 - h := (zmax - zmin) * 16 + w := (xmax - xmin) * mcmap.ChunkSizeXZ + h := (zmax - zmin) * mcmap.ChunkSizeXZ img := image.NewRGBA(image.Rect(0, 0, w, h)) chunkLoop: @@ -44,19 +44,19 @@ chunkLoop: os.Exit(1) } - for x := 0; x < 16; x++ { + for x := 0; x < mcmap.ChunkSizeXZ; x++ { scanZ: - for z := 0; z < 16; z++ { + for z := 0; z < mcmap.ChunkSizeXZ; z++ { ax, az := mcmap.ChunkToBlock(cx, cz, x, z) - for y := 255; y >= 0; y-- { + for y := mcmap.ChunkSizeY; y >= 0; y-- { blk := chunk.Block(x, y, z) c, ok := colors[blk.ID] if ok { - img.Set(ax-(xmin*16), az-(zmin*16), c) + img.Set(ax-(xmin*mcmap.ChunkSizeXZ), az-(zmin*mcmap.ChunkSizeXZ), c) continue scanZ } } - img.Set(ax-(xmin*16), az-(zmin*16), rgb(0x000000)) + img.Set(ax-(xmin*mcmap.ChunkSizeXZ), az-(zmin*mcmap.ChunkSizeXZ), rgb(0x000000)) } } diff --git a/mcmap/examples/replace/main.go b/mcmap/examples/replace/main.go index e5fff78..87dd677 100644 --- a/mcmap/examples/replace/main.go +++ b/mcmap/examples/replace/main.go @@ -37,9 +37,9 @@ chunkLoop: } modified := false - for y := 0; y < 256; y++ { - for x := 0; x < 16; x++ { - for z := 0; z < 16; z++ { + for y := 0; y < mcmap.ChunkSizeY; y++ { + for x := 0; x < mcmap.ChunkSizeXZ; x++ { + for z := 0; z < mcmap.ChunkSizeXZ; z++ { blk := chunk.Block(x, y, z) if blk.ID == mcmap.BlkBlockOfIron { blk.ID = mcmap.BlkBlockOfDiamond diff --git a/mcmap/prechunk.go b/mcmap/prechunk.go index ae0ea2a..ef6ba33 100644 --- a/mcmap/prechunk.go +++ b/mcmap/prechunk.go @@ -124,7 +124,7 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { return nil, fmt.Errorf("Could not read InhabitatedTime tag: %s", err) } - c.biomes = make([]Biome, 256) + c.biomes = make([]Biome, ChunkRectXZ) biomes, err := lvl.GetByteArray("Biomes") switch err { case nil: @@ -132,7 +132,7 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { c.biomes[i] = Biome(bio) } case nbt.NotFound: - for i := 0; i < 256; i++ { + for i := 0; i < ChunkRectXZ; i++ { c.biomes[i] = BioUncalculated } default: @@ -162,7 +162,7 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { return nil, fmt.Errorf("Could not read Section tag: %s", err) } - c.blocks = make([]Block, 16*16*256) + c.blocks = make([]Block, ChunkSize) for _, _section := range sections.Elems { section := _section.(nbt.TagCompound) @@ -170,17 +170,17 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { if err != nil { return nil, fmt.Errorf("Could not read Section -> Y tag: %s", err) } - off := int(y) * 4096 + off := int(y) * chunkSectionSize blocks, err := section.GetByteArray("Blocks") if err != nil { return nil, fmt.Errorf("Could not read Section -> Blocks tag: %s", err) } - blocksAdd := make([]byte, 4096) + blocksAdd := make([]byte, chunkSectionSize) add, err := section.GetByteArray("Add") switch err { case nil: - for i := 0; i < 4096; i++ { + for i := 0; i < chunkSectionSize; i++ { blocksAdd[i] = halfbyte(add, i) } case nbt.NotFound: @@ -201,7 +201,7 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { return nil, fmt.Errorf("Could not read Section -> SkyLight tag: %s", err) } - for i := 0; i < 4096; i++ { + for i := 0; i < chunkSectionSize; i++ { c.blocks[off+i] = Block{ ID: BlockID(uint16(blocks[i]) | (uint16(blocksAdd[i]) << 8)), Data: halfbyte(blkData, i), @@ -239,8 +239,8 @@ func (pc *preChunk) toChunk(reg *Region) (*Chunk, error) { _, _, x, z = BlockToChunk(x, z) - x %= 16 - z %= 16 + x %= ChunkSizeXZ + z %= ChunkSizeXZ tick := TileTick{} if tick.i, err = tTick.GetInt("i"); err != nil { @@ -281,7 +281,7 @@ func (c *Chunk) toPreChunk() (*preChunk, error) { } hasBiomes := false - biomes := make([]byte, 16*16) + biomes := make([]byte, ChunkRectXZ) for i, bio := range c.biomes { if bio != BioUncalculated { hasBiomes = true @@ -298,16 +298,16 @@ func (c *Chunk) toPreChunk() (*preChunk, error) { tileTicks := make([]nbt.TagCompound, 0) for subchunk := 0; subchunk < 16; subchunk++ { - off := subchunk * 4096 + off := subchunk * chunkSectionSize - blocks := make([]byte, 4096) - add := make([]byte, 2048) - data := make([]byte, 2048) - blockLight := make([]byte, 2048) - skyLight := make([]byte, 2048) + blocks := make([]byte, chunkSectionSize) + add := make([]byte, chunkSectionSize/2) + data := make([]byte, chunkSectionSize/2) + blockLight := make([]byte, chunkSectionSize/2) + skyLight := make([]byte, chunkSectionSize/2) allAir, addEmpty := true, true - for i := 0; i < 4096; i++ { + for i := 0; i < chunkSectionSize; i++ { blk := c.blocks[i+off] id := blk.ID if id != BlkAir { diff --git a/mcmap/region.go b/mcmap/region.go index 0e569da..8a5fd9f 100644 --- a/mcmap/region.go +++ b/mcmap/region.go @@ -97,24 +97,24 @@ func (reg *Region) MaxDims() (xmin, xmax, zmin, zmax int) { xmax++ zmax++ - xmin *= 32 - xmax *= 32 - zmin *= 32 - zmax *= 32 + xmin *= superchunkSizeXZ + xmax *= superchunkSizeXZ + zmin *= superchunkSizeXZ + zmax *= superchunkSizeXZ return } func chunkToSuperchunk(cx, cz int) (scx, scz, rx, rz int) { scx = cx >> 5 scz = cz >> 5 - rx = ((cx % 32) + 32) % 32 - rz = ((cz % 32) + 32) % 32 + rx = ((cx % superchunkSizeXZ) + superchunkSizeXZ) % superchunkSizeXZ + rz = ((cz % superchunkSizeXZ) + superchunkSizeXZ) % superchunkSizeXZ return } func superchunkToChunk(scx, scz, rx, rz int) (cx, cz int) { - cx = scx*32 + rx - cz = scz*32 + rz + cx = scx*superchunkSizeXZ + rx + cz = scz*superchunkSizeXZ + rz return } @@ -250,8 +250,8 @@ func (reg *Region) AllChunks() <-chan XZPos { go func(ch chan<- XZPos) { for spos, _ := range reg.superchunksAvail { scx, scz := spos.X, spos.Z - for rx := 0; rx < 32; rx++ { - for rz := 0; rz < 32; rz++ { + for rx := 0; rx < superchunkSizeXZ; rx++ { + for rz := 0; rz < superchunkSizeXZ; rz++ { cx, cz := superchunkToChunk(scx, scz, rx, rz) ch <- XZPos{cx, cz} } diff --git a/mcmap/regionfile.go b/mcmap/regionfile.go index ff9794e..746c32d 100644 --- a/mcmap/regionfile.go +++ b/mcmap/regionfile.go @@ -57,8 +57,8 @@ func readRegionFile(r io.ReadSeeker) (map[XZPos]*preChunk, error) { offs := make(map[XZPos]*chunkOffTs) - for z := 0; z < 32; z++ { - for x := 0; x < 32; x++ { + for z := 0; z < superchunkSizeXZ; z++ { + for x := 0; x < superchunkSizeXZ; x++ { var location uint32 if err := binary.Read(r, binary.BigEndian, &location); err != nil { return nil, err @@ -75,8 +75,8 @@ func readRegionFile(r io.ReadSeeker) (map[XZPos]*preChunk, error) { } } - for z := 0; z < 32; z++ { - for x := 0; x < 32; x++ { + for z := 0; z < superchunkSizeXZ; z++ { + for x := 0; x < superchunkSizeXZ; x++ { pos := XZPos{x, z} var ts int32 @@ -119,7 +119,7 @@ func (pc *preChunk) writePreChunk(w io.Writer) error { func writeRegionFile(w io.Writer, pcs map[XZPos]*preChunk) error { offs := make(map[XZPos]chunkOffTs) buf := new(bytes.Buffer) - pw := kagus.NewPaddedWriter(buf, 4096) + pw := kagus.NewPaddedWriter(buf, sectorSize) for pos, pc := range pcs { off := buf.Len() @@ -130,14 +130,14 @@ func writeRegionFile(w io.Writer, pcs map[XZPos]*preChunk) error { return err } offs[pos] = chunkOffTs{ - offset: int64(8192 + off), + offset: int64(2*sectorSize + off), size: int64(buf.Len() - off), ts: pc.ts, } } - for z := 0; z < 32; z++ { - for x := 0; x < 32; x++ { + for z := 0; z < superchunkSizeXZ; z++ { + for x := 0; x < superchunkSizeXZ; x++ { off := uint32(0) if cOff, ok := offs[XZPos{x, z}]; ok { off = cOff.calcLocationEntry() @@ -149,8 +149,8 @@ func writeRegionFile(w io.Writer, pcs map[XZPos]*preChunk) error { } } - for z := 0; z < 32; z++ { - for x := 0; x < 32; x++ { + for z := 0; z < superchunkSizeXZ; z++ { + for x := 0; x < superchunkSizeXZ; x++ { ts := int32(0) if cOff, ok := offs[XZPos{x, z}]; ok { ts = int32(cOff.ts.Unix()) |