Resolve pre-1.13 block types by mapping them to 1.13 types

This commit is contained in:
Matthias Schiffer 2018-07-24 01:33:21 +02:00
parent fed9c21f5e
commit dd432af298
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C
4 changed files with 87 additions and 4622 deletions

File diff suppressed because it is too large Load diff

View file

@ -27,17 +27,33 @@
#pragma once
#include <cstdint>
#include <string>
#include <unordered_map>
namespace MinedMap {
namespace Resource {
struct BlockType {
private:
static const std::unordered_map<std::string, BlockType> Types;
public:
static const BlockType * lookup(const std::string &name);
bool opaque;
bool green;
uint32_t color;
bool blue;
struct {
uint8_t r, g, b;
} color;
};
extern const BlockType BLOCK_TYPES[256][16];
struct LegacyPalette {
const BlockType *types[256][16];
};
extern const LegacyPalette LEGACY_BLOCK_TYPES;
}
}

View file

@ -25,22 +25,21 @@
#include "Block.hpp"
#include "../Resource/BlockType.hpp"
#include "../Resource/Biome.hpp"
#include "../Resource/BlockType.hpp"
namespace MinedMap {
namespace World {
uint32_t Block::getColor() const {
const Resource::BlockType &t = Resource::BLOCK_TYPES[id][data];
if (!t.opaque)
const Resource::BlockType *type = Resource::LEGACY_BLOCK_TYPES.types[id][data];
if (!type || !type->opaque)
return 0;
unsigned r = uint8_t(t.color >> 16);
unsigned g = uint8_t(t.color >> 8);
unsigned b = uint8_t(t.color);
float r = type->color.r;
float g = type->color.g;
float b = type->color.b;
float heightCoef = height/255.0f + 0.5f;
@ -48,7 +47,7 @@ uint32_t Block::getColor() const {
g *= heightCoef;
b *= heightCoef;
if (t.green) {
if (type->green) {
const Resource::Biome &biomeDef = Resource::BIOMES[biome];
r *= biomeDef.r;
@ -56,11 +55,17 @@ uint32_t Block::getColor() const {
b *= biomeDef.b;
}
if (type->blue) {
r *= 0.265;
g *= 0.382;
b *= 1.379;
}
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
return (r << 24) | (g << 16) | (b << 8) | 0xff;
return ((unsigned)r << 24) | ((unsigned)g << 16) | ((unsigned)b << 8) | 0xff;
}
}

View file

@ -128,7 +128,9 @@ Chunk::Blocks Chunk::getTopLayer() const {
uint8_t id = getBlockAt(x, y, z);
uint8_t data = getDataAt(x, y, z);
if (!Resource::BLOCK_TYPES[id][data].opaque)
const Resource::BlockType *type = Resource::LEGACY_BLOCK_TYPES.types[id][data];
if (!type || !type->opaque)
continue;
ret.blocks[x][z] = getBlock(x, y, z);