mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-05 23:13:33 +00:00
the whole game
This commit is contained in:
140
src/world/level/dimension/Dimension.cpp
Executable file
140
src/world/level/dimension/Dimension.cpp
Executable file
@@ -0,0 +1,140 @@
|
||||
#include "Dimension.h"
|
||||
#include "NormalDayCycleDimension.h"
|
||||
|
||||
//#include "../levelgen/SimpleLevelSource.h"
|
||||
#include "../levelgen/RandomLevelSource.h"
|
||||
#include "../Level.h"
|
||||
#include "../biome/BiomeSource.h"
|
||||
#include "../chunk/ChunkSource.h"
|
||||
#include "../tile/Tile.h"
|
||||
#include "../../../util/Mth.h"
|
||||
|
||||
|
||||
Dimension::Dimension()
|
||||
: foggy(false),
|
||||
ultraWarm(false),
|
||||
hasCeiling(false),
|
||||
biomeSource(NULL),
|
||||
id(0)
|
||||
{
|
||||
}
|
||||
|
||||
Dimension::~Dimension()
|
||||
{
|
||||
delete biomeSource;
|
||||
}
|
||||
|
||||
void Dimension::init( Level* level )
|
||||
{
|
||||
this->level = level;
|
||||
init();
|
||||
updateLightRamp();
|
||||
}
|
||||
|
||||
void Dimension::init()
|
||||
{
|
||||
biomeSource = new BiomeSource(level);
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
bool Dimension::isValidSpawn(int x, int z) {
|
||||
int topTile = level->getTopTile(x, z);
|
||||
|
||||
if (topTile == Tile::invisible_bedrock->id)
|
||||
return false;
|
||||
|
||||
//if (topTile != Tile::sand->id) return false;
|
||||
if (!Tile::tiles[topTile]->isSolidRender()) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
float Dimension::getTimeOfDay(long time, float a) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
ChunkSource* Dimension::createRandomLevelSource() {
|
||||
return new RandomLevelSource(
|
||||
level,
|
||||
level->getSeed(),
|
||||
level->getLevelData()->getGeneratorVersion(),
|
||||
!level->isClientSide && level->getLevelData()->getSpawnMobs());
|
||||
//return new PerformanceTestChunkSource(level);
|
||||
}
|
||||
|
||||
|
||||
void Dimension::updateLightRamp()
|
||||
{
|
||||
float ambientLight = 0.05f;
|
||||
for (int i = 0; i <= 15; /*Level::MAX_BRIGHTNESS;*/ i++) {
|
||||
float v = (1 - i / (float) (16 /*Level::MAX_BRIGHTNESS*/));
|
||||
// Boosted ambient lightning by ten times.
|
||||
brightnessRamp[i] = ((1 - v) / (v * 3 + 1)) * (1 - ambientLight) + ambientLight * 3;
|
||||
}
|
||||
}
|
||||
|
||||
float* Dimension::getSunriseColor( float td, float a )
|
||||
{
|
||||
float span = 0.4f;
|
||||
float tt = Mth::cos(td * Mth::PI * 2) - 0.0f;
|
||||
float mid = -0.0f;
|
||||
if (tt >= mid - span && tt <= mid + span) {
|
||||
float aa = ((tt - mid) / span) * 0.5f + 0.5f;
|
||||
float mix = 1 - (((1 - Mth::sin(aa * Mth::PI))) * 0.99f);
|
||||
mix = mix * mix;
|
||||
sunriseCol[0] = (aa * 0.3f + 0.7f);
|
||||
sunriseCol[1] = (aa * aa * 0.7f + 0.2f);
|
||||
sunriseCol[2] = (aa * aa * 0.0f + 0.2f);
|
||||
sunriseCol[3] = mix;
|
||||
return sunriseCol;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Vec3 Dimension::getFogColor( float td, float a )
|
||||
{
|
||||
float br = Mth::cos(td * Mth::PI * 2) * 2 + 0.5f;
|
||||
if (br < 0.0f) br = 0.0f;
|
||||
if (br > 1.0f) br = 1.0f;
|
||||
|
||||
float r = ((fogColor >> 16) & 0xff) / 255.0f;
|
||||
float g = ((fogColor >> 8) & 0xff) / 255.0f;
|
||||
float b = ((fogColor) & 0xff) / 255.0f;
|
||||
r *= br * 0.94f + 0.06f;
|
||||
g *= br * 0.94f + 0.06f;
|
||||
b *= br * 0.91f + 0.09f;
|
||||
return Vec3(r, g, b);
|
||||
//return Vec3(0.752941f, 0.847059f, 1);
|
||||
}
|
||||
|
||||
bool Dimension::mayRespawn()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Dimension* Dimension::getNew( int id )
|
||||
{
|
||||
if (id == NORMAL) return new Dimension();
|
||||
if (id == NORMAL_DAYCYCLE) return new NormalDayCycleDimension();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// DimensionFactory
|
||||
//
|
||||
#include "../storage/LevelData.h"
|
||||
Dimension* DimensionFactory::createDefaultDimension(LevelData* data )
|
||||
{
|
||||
int dimensionId = Dimension::NORMAL;
|
||||
|
||||
switch(data->getGameType()) {
|
||||
case GameType::Survival: dimensionId = Dimension::NORMAL_DAYCYCLE;
|
||||
break;
|
||||
case GameType::Creative:
|
||||
default:
|
||||
dimensionId = Dimension::NORMAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return Dimension::getNew(dimensionId);
|
||||
}
|
||||
64
src/world/level/dimension/Dimension.h
Executable file
64
src/world/level/dimension/Dimension.h
Executable file
@@ -0,0 +1,64 @@
|
||||
#ifndef NET_MINECRAFT_WORLD_LEVEL_DIMENSION__Dimension_H__
|
||||
#define NET_MINECRAFT_WORLD_LEVEL_DIMENSION__Dimension_H__
|
||||
|
||||
//package net.minecraft.world.level.dimension;
|
||||
|
||||
#include "../../phys/Vec3.h"
|
||||
|
||||
class Level;
|
||||
class BiomeSource;
|
||||
class ChunkSource;
|
||||
|
||||
class Dimension
|
||||
{
|
||||
public:
|
||||
static const int NORMAL = 0;
|
||||
static const int NORMAL_DAYCYCLE = 10;
|
||||
|
||||
Dimension();
|
||||
virtual ~Dimension();
|
||||
virtual void init(Level* level);
|
||||
|
||||
//@fix @port The caller is responsible for this ChunkSource, I presume
|
||||
virtual ChunkSource* createRandomLevelSource();
|
||||
|
||||
virtual bool isValidSpawn(int x, int z);
|
||||
virtual bool isNaturalDimension() {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual float getTimeOfDay(long time, float a);
|
||||
virtual float* getSunriseColor(float td, float a);
|
||||
virtual Vec3 getFogColor(float td, float a);
|
||||
|
||||
virtual bool mayRespawn();
|
||||
|
||||
// @fix @port Caller is responsible (+ move this to a "factory method" outside?)
|
||||
// @NOTE: RIGHT NOW, Level deletes the dimension.
|
||||
static Dimension* getNew(int id);
|
||||
|
||||
protected:
|
||||
virtual void updateLightRamp();
|
||||
virtual void init();
|
||||
|
||||
public:
|
||||
Level* level;
|
||||
BiomeSource* biomeSource;
|
||||
bool foggy;
|
||||
bool ultraWarm;
|
||||
bool hasCeiling;
|
||||
float brightnessRamp[16];//Level::MAX_BRIGHTNESS + 1];
|
||||
int id;
|
||||
protected:
|
||||
static const long fogColor = 0x80daff;//0x406fe5;//0xc0d8ff;
|
||||
float sunriseCol[4];
|
||||
};
|
||||
|
||||
class LevelData;
|
||||
class DimensionFactory
|
||||
{
|
||||
public:
|
||||
static Dimension* createDefaultDimension(LevelData* data);
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_WORLD_LEVEL_DIMENSION__Dimension_H__*/
|
||||
41
src/world/level/dimension/NormalDayCycleDimension.h
Executable file
41
src/world/level/dimension/NormalDayCycleDimension.h
Executable file
@@ -0,0 +1,41 @@
|
||||
#ifndef NET_MINECRAFT_WORLD_LEVEL_DIMENSION__NormalDayCycleDimension_H__
|
||||
#define NET_MINECRAFT_WORLD_LEVEL_DIMENSION__NormalDayCycleDimension_H__
|
||||
|
||||
//package net.minecraft.world.level.dimension;
|
||||
|
||||
#include "Dimension.h"
|
||||
#include "../Level.h"
|
||||
#include "../../../util/Mth.h"
|
||||
|
||||
class NormalDayCycleDimension: public Dimension {
|
||||
public:
|
||||
float getTimeOfDay(long time, float a) {
|
||||
int dayStep = (int) (time % Level::TICKS_PER_DAY);
|
||||
float td = (dayStep + a) / Level::TICKS_PER_DAY - 0.25f;
|
||||
if (td < 0) td += 1;
|
||||
if (td > 1) td -= 1;
|
||||
float tdo = td;
|
||||
td = 1 - (cos(td * Mth::PI) + 1) * 0.5f;
|
||||
return tdo + (td - tdo) / 3.0f;
|
||||
}
|
||||
|
||||
Vec3 getFogColor( float td, float a ) {
|
||||
float br = cos(td * Mth::PI * 2) * 2 + 0.5f;
|
||||
if (br < 0) br = 0;
|
||||
if (br > 1.f) br = 1.f;
|
||||
|
||||
float r = ((fogColor >> 16) & 0xff) / 255.0f;
|
||||
float g = ((fogColor >> 8) & 0xff) / 255.0f;
|
||||
float b = ((fogColor) & 0xff) / 255.0f;
|
||||
r *= br * 0.94f + 0.06f;
|
||||
g *= br * 0.94f + 0.06f;
|
||||
b *= br * 0.91f + 0.09f;
|
||||
|
||||
//LOGI("rgb: %f, %f, %f\n", r, g, b);
|
||||
|
||||
return Vec3(r, g, b);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif /*NET_MINECRAFT_WORLD_LEVEL_DIMENSION__NormalDayCycleDimension_H__*/
|
||||
Reference in New Issue
Block a user