Files
MinecraftConsoles/Minecraft.World/BiomeCache.cpp
ModMaker101 a9be52c41a Project modernization (#630)
* Fixed boats falling and a TP glitch #266

* Replaced every C-style cast with C++ ones

* Replaced every C-style cast with C++ ones

* Fixed boats falling and a TP glitch #266

* Updated NULL to nullptr and fixing some type issues

* Modernized and fixed a few bugs

- Replaced most instances of `NULL` with `nullptr`.
- Replaced most `shared_ptr(new ...)` with `make_shared`.
- Removed the `nullptr` macro as it was interfering with the actual nullptr keyword in some instances.

* Fixing more conflicts

* Replace int loops with size_t and start work on overrides
2026-03-08 09:56:03 +07:00

165 lines
4.0 KiB
C++

#include "stdafx.h"
#include "Biome.h"
#include "BiomeSource.h"
#include "BiomeCache.h"
#include "System.h"
BiomeCache::Block::Block(int x, int z, BiomeCache *parent)
{
// temps = floatArray(ZONE_SIZE * ZONE_SIZE, false); // MGH - added "no clear" flag to arrayWithLength
// downfall = floatArray(ZONE_SIZE * ZONE_SIZE, false);
// biomes = BiomeArray(ZONE_SIZE * ZONE_SIZE, false);
biomeIndices = byteArray(static_cast<unsigned int>(ZONE_SIZE * ZONE_SIZE), false);
lastUse = 0;
this->x = x;
this->z = z;
// parent->source->getTemperatureBlock(temps, x << ZONE_SIZE_BITS, z << ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE);
// parent->source->getDownfallBlock(downfall, x << ZONE_SIZE_BITS, z << ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE);
// parent->source->getBiomeBlock(biomes, x << ZONE_SIZE_BITS, z << ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE, false);
parent->source->getBiomeIndexBlock(biomeIndices, x << ZONE_SIZE_BITS, z << ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE, false);
}
BiomeCache::Block::~Block()
{
// delete [] temps.data;
// delete [] downfall.data;
// delete [] biomes.data;
delete [] biomeIndices.data;
}
Biome *BiomeCache::Block::getBiome(int x, int z)
{
// return biomes[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
const int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex];
}
float BiomeCache::Block::getTemperature(int x, int z)
{
// return temps[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
const int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex]->getTemperature();
}
float BiomeCache::Block::getDownfall(int x, int z)
{
// return downfall[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
const int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex]->getDownfall();
}
BiomeCache::BiomeCache(BiomeSource *source)
{
// 4J Initialisors
lastUpdateTime = 0;
this->source = source;
InitializeCriticalSection(&m_CS);
}
BiomeCache::~BiomeCache()
{
// 4J Stu - Delete source?
// delete source;
for(const auto& it : all )
{
delete it;
}
DeleteCriticalSection(&m_CS);
}
BiomeCache::Block *BiomeCache::getBlockAt(int x, int z)
{
EnterCriticalSection(&m_CS);
x >>= ZONE_SIZE_BITS;
z >>= ZONE_SIZE_BITS;
const int64_t slot = (static_cast<int64_t>(x) & 0xffffffffl) | ((static_cast<int64_t>(z) & 0xffffffffl) << 32l);
const auto it = cached.find(slot);
Block *block = nullptr;
if (it == cached.end())
{
MemSect(48);
block = new Block(x, z, this);
cached[slot] = block;
all.push_back(block);
MemSect(0);
}
else
{
block = it->second;
}
block->lastUse = app.getAppTime();
LeaveCriticalSection(&m_CS);
return block;
}
Biome *BiomeCache::getBiome(int x, int z)
{
return getBlockAt(x, z)->getBiome(x, z);
}
float BiomeCache::getTemperature(int x, int z)
{
return getBlockAt(x, z)->getTemperature(x, z);
}
float BiomeCache::getDownfall(int x, int z)
{
return getBlockAt(x, z)->getDownfall(x, z);
}
void BiomeCache::update()
{
EnterCriticalSection(&m_CS);
const int64_t now = app.getAppTime();
const int64_t utime = now - lastUpdateTime;
if (utime > DECAY_TIME / 4 || utime < 0)
{
lastUpdateTime = now;
for (auto it = all.begin(); it != all.end();)
{
const Block *block = *it;
const int64_t time = now - block->lastUse;
if (time > DECAY_TIME || time < 0)
{
it = all.erase(it);
int64_t slot = (static_cast<int64_t>(block->x) & 0xffffffffl) | ((static_cast<int64_t>(block->z) & 0xffffffffl) << 32l);
cached.erase(slot);
delete block;
}
else
{
++it;
}
}
}
LeaveCriticalSection(&m_CS);
}
BiomeArray BiomeCache::getBiomeBlockAt(int x, int z)
{
byteArray indices = getBlockAt(x, z)->biomeIndices;
BiomeArray biomes(indices.length);
for(int i=0;i<indices.length;i++)
biomes[i] = Biome::biomes[indices[i]];
return biomes;
}
byteArray BiomeCache::getBiomeIndexBlockAt(int x, int z)
{
return getBlockAt(x, z)->biomeIndices;
}