refactor: Changed some file names and moved some files around
This commit is contained in:
parent
df2a128e1b
commit
2219c34c35
@ -4,13 +4,55 @@ import (
|
|||||||
"github.com/Tnze/go-mc/save"
|
"github.com/Tnze/go-mc/save"
|
||||||
)
|
)
|
||||||
|
|
||||||
const ChunkSectionCount = 16
|
const (
|
||||||
|
// The number of sections per chunk. This determines the total height of the
|
||||||
|
// chunk
|
||||||
|
ChunkSectionCount = 16
|
||||||
|
|
||||||
|
// The number of blocks in a horizontal slice of a chunk
|
||||||
|
chunkSliceSize = 16 * 16
|
||||||
|
)
|
||||||
|
|
||||||
|
// `ChunkData` represents the contents of a "chunk", which is a column of voxels
|
||||||
|
// in world space
|
||||||
type ChunkData struct {
|
type ChunkData struct {
|
||||||
Pos ChunkPos `json:"pos"`
|
Pos ChunkPos `json:"pos"`
|
||||||
Sections [ChunkSectionCount]ChunkSection `json:"sections"`
|
Sections [ChunkSectionCount]ChunkSection `json:"sections"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `ChunkSection' is a fixed-size cube that stores the data in a chunk
|
||||||
|
type ChunkSection struct {
|
||||||
|
// The count of full blocks in the chunk
|
||||||
|
BlockCount uint `json:"block_count"`
|
||||||
|
BlockStates [16 * 16 * 16]BlockID `json:"block_states"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func rem_euclid(a, b int) int {
|
||||||
|
return (a%b + b) % b
|
||||||
|
}
|
||||||
|
|
||||||
|
func IndexOfBlock(pos BlockPos) int {
|
||||||
|
baseX := rem_euclid(pos.X, 16)
|
||||||
|
baseY := rem_euclid(int(pos.Y), 16)
|
||||||
|
baseZ := rem_euclid(pos.Z, 16)
|
||||||
|
|
||||||
|
return (baseY * chunkSliceSize) + (baseZ * 16) + baseX
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cs *ChunkSection) UpdateBlockAtIndex(index int, targetState BlockID) {
|
||||||
|
// TODO: Keep track of the block count
|
||||||
|
|
||||||
|
cs.BlockStates[index] = targetState
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cs *ChunkSection) UpdateBlock(pos BlockPos, targetState BlockID) {
|
||||||
|
cs.BlockStates[IndexOfBlock(pos)] = targetState
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cs *ChunkSection) FetchBlock(pos BlockPos) BlockID {
|
||||||
|
return cs.BlockStates[IndexOfBlock(pos)]
|
||||||
|
}
|
||||||
|
|
||||||
func (cd *ChunkData) SectionFor(pos BlockPos) *ChunkSection {
|
func (cd *ChunkData) SectionFor(pos BlockPos) *ChunkSection {
|
||||||
return &cd.Sections[pos.Y%ChunkSectionCount]
|
return &cd.Sections[pos.Y%ChunkSectionCount]
|
||||||
}
|
}
|
@ -1,88 +0,0 @@
|
|||||||
package world
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Slice size is the total number of blocks in a horizontal slice of a chunk
|
|
||||||
sliceSize = 16 * 16
|
|
||||||
)
|
|
||||||
|
|
||||||
type BlockPos struct {
|
|
||||||
X int `json:"x"`
|
|
||||||
Y uint `json:"y"`
|
|
||||||
Z int `json:"z"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b BlockPos) String() string {
|
|
||||||
return fmt.Sprintf("BlockPos { X: %v, Y: %v, Z: %v }", b.X, b.Y, b.Z)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RandomBlockPosWithRange(maxRange float64) BlockPos {
|
|
||||||
return BlockPos{
|
|
||||||
X: int(rand.NormFloat64() * maxRange),
|
|
||||||
Y: uint(rand.NormFloat64() * maxRange),
|
|
||||||
Z: int(rand.NormFloat64() * maxRange),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b BlockPos) ToChunkPos() ChunkPos {
|
|
||||||
return ChunkPos{
|
|
||||||
X: b.X / 16,
|
|
||||||
Z: b.Z / 16,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChunkPos struct {
|
|
||||||
X int `json:"x"`
|
|
||||||
Z int `json:"z"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cp ChunkPos) ToFileName() string {
|
|
||||||
return fmt.Sprintf("p.%d.%d.chunk", cp.X, cp.Z)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cp ChunkPos) StringCoords() string {
|
|
||||||
return fmt.Sprintf("%d, %d", cp.X, cp.Z)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ChunkSection struct {
|
|
||||||
// The count of full blocks in the chunk
|
|
||||||
BlockCount uint `json:"block_count"`
|
|
||||||
BlockStates [16 * 16 * 16]BlockID `json:"block_states"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func rem_euclid(a, b int) int {
|
|
||||||
return (a%b + b) % b
|
|
||||||
}
|
|
||||||
|
|
||||||
func IndexOfBlock(pos BlockPos) int {
|
|
||||||
baseX := rem_euclid(pos.X, 16)
|
|
||||||
baseY := rem_euclid(int(pos.Y), 16)
|
|
||||||
baseZ := rem_euclid(pos.Z, 16)
|
|
||||||
|
|
||||||
return (baseY * sliceSize) + (baseZ * 16) + baseX
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cs *ChunkSection) UpdateBlockAtIndex(index int, targetState BlockID) {
|
|
||||||
// TODO: Keep track of the block count
|
|
||||||
|
|
||||||
cs.BlockStates[index] = targetState
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cs *ChunkSection) UpdateBlock(pos BlockPos, targetState BlockID) {
|
|
||||||
cs.BlockStates[IndexOfBlock(pos)] = targetState
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cs *ChunkSection) FetchBlock(pos BlockPos) BlockID {
|
|
||||||
return cs.BlockStates[IndexOfBlock(pos)]
|
|
||||||
}
|
|
||||||
|
|
||||||
type BlockID uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
Empty BlockID = iota
|
|
||||||
Generic
|
|
||||||
)
|
|
51
world/world_position.go
Normal file
51
world/world_position.go
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package world
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BlockPos struct {
|
||||||
|
X int `json:"x"`
|
||||||
|
Y uint `json:"y"`
|
||||||
|
Z int `json:"z"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BlockPos) String() string {
|
||||||
|
return fmt.Sprintf("BlockPos { X: %v, Y: %v, Z: %v }", b.X, b.Y, b.Z)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RandomBlockPosWithRange(maxRange float64) BlockPos {
|
||||||
|
return BlockPos{
|
||||||
|
X: int(rand.NormFloat64() * maxRange),
|
||||||
|
Y: uint(rand.NormFloat64() * maxRange),
|
||||||
|
Z: int(rand.NormFloat64() * maxRange),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b BlockPos) ToChunkPos() ChunkPos {
|
||||||
|
return ChunkPos{
|
||||||
|
X: b.X / 16,
|
||||||
|
Z: b.Z / 16,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChunkPos struct {
|
||||||
|
X int `json:"x"`
|
||||||
|
Z int `json:"z"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cp ChunkPos) ToFileName() string {
|
||||||
|
return fmt.Sprintf("p.%d.%d.chunk", cp.X, cp.Z)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cp ChunkPos) StringCoords() string {
|
||||||
|
return fmt.Sprintf("%d, %d", cp.X, cp.Z)
|
||||||
|
}
|
||||||
|
|
||||||
|
type BlockID uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
Empty BlockID = iota
|
||||||
|
Generic
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user