Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
4.1 kB · 165 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165#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(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)];
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)];
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)];
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(AUTO_VAR(it, all.begin()); it != all.end(); ++it) { delete (*it); } DeleteCriticalSection(&m_CS);}
BiomeCache::Block *BiomeCache::getBlockAt(int x, int z){ EnterCriticalSection(&m_CS); x >>= ZONE_SIZE_BITS; z >>= ZONE_SIZE_BITS; __int64 slot = (((__int64) x) & 0xffffffffl) | ((((__int64) z) & 0xffffffffl) << 32l); AUTO_VAR(it, cached.find(slot)); Block *block = NULL; 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); __int64 now = app.getAppTime(); __int64 utime = now - lastUpdateTime; if (utime > DECAY_TIME / 4 || utime < 0) { lastUpdateTime = now;
for (AUTO_VAR(it, all.begin()); it != all.end();) { Block *block = *it; __int64 time = now - block->lastUse; if (time > DECAY_TIME || time < 0) { it = all.erase(it); __int64 slot = (((__int64) block->x) & 0xffffffffl) | ((((__int64) 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;}