diff --git a/definitions/readme_biomes.txt b/definitions/readme_biomes.txt index 1527e4e..5352563 100644 --- a/definitions/readme_biomes.txt +++ b/definitions/readme_biomes.txt @@ -29,9 +29,11 @@ the new tag "data18" is used to define Biomes: Some special values can be derived from the Minecraft source code: -"watermodifier" - special color of water (in swamps) -"temperature" - default 0.5 -"humidity" - default 0.5 +"watermodifier" - special color of water (in swamps) +"grassmodifier" - special color of grass (otherwise derived by temperature and humidity) +"foliagemodifier" - special color of leaves (otherwise derived by temperature and humidity) +"temperature" - default 0.5 +"humidity" - default 0.5 Some stuff is hard coded inside Minecraft source code. To handle these edge cases, @@ -40,9 +42,7 @@ some additional boolean flags can be used: "ocean" - used for Drawned spawn detection (guess trigger is "ocean") "river" - used for Drawned spawn detection (guess trigger is "river") -"swamp" - used for hard coded foliage colors (guess trigger is "swamp") -"darkforest" - used for hard coded foliage colors (guess trigger is "dark forest") -"badlands" - used for hard coded foliage colors (guess trigger is "badlands" and "mesa") +"darkforest" - used for special blended foliage colors (guess trigger is "dark forest") For Minecraft up to 1.17 Biomes were stored as numerical ID for that we have diff --git a/definitions/vanilla_biomes.json b/definitions/vanilla_biomes.json index 3af113f..205cc2f 100644 --- a/definitions/vanilla_biomes.json +++ b/definitions/vanilla_biomes.json @@ -1,7 +1,7 @@ { "name": "Vanilla", "type": "biome", - "version": "26.3.1", + "version": "26.3.1a", "data18": [ { "id": "minecraft:ocean", @@ -41,6 +41,8 @@ "id": "minecraft:swamp", "color": "#07f9b2", "watermodifier": "#617b64", + "grassmodifier": "#6a7039", + "foliagemodifier": "#6a7039", "temperature": 0.8, "humidity": 0.9 }, @@ -163,12 +165,16 @@ { "id": "minecraft:badlands", "color": "#d94515", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, { "id": "minecraft:wooded_badlands", "color": "#b09765", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -272,6 +278,8 @@ { "id": "minecraft:eroded_badlands", "color": "#ff6d3d", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -397,8 +405,10 @@ }, { "id": "minecraft:dappled_forest", - "color": "#c8c828", - "watermodifier": "#9a3f35", + "color": "#9a3f35", + "watermodifier": "#375154", + "grassmodifier": "#df6827", + "foliagemodifier": "#e68e30", "temperature": 0.6, "humidity": 0.6 } @@ -455,6 +465,8 @@ "name": "Swamp", "color": "#07f9b2", "watermodifier": "#617b64", + "grassmodifier": "#6a7039", + "foliagemodifier": "#6a7039", "temperature": 0.8, "humidity": 0.9 }, @@ -696,6 +708,8 @@ "name": "Badlands", "color": "#d94515", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -704,6 +718,8 @@ "name": "Wooded Badlands Plateau", "color": "#b09765", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -712,6 +728,8 @@ "name": "Badlands Plateau", "color": "#ca8c65", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -832,6 +850,8 @@ "name": "Swamp Hills", "color": "#2fffda", "watermodifier": "#617b64", + "grassmodifier": "#6a7039", + "foliagemodifier": "#6a7039", "temperature": 0.8, "humidity": 0.9 }, @@ -936,6 +956,8 @@ "name": "Eroded Badlands", "color": "#ff6d3d", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -944,6 +966,8 @@ "name": "Modified Wooded Badlands Plateau", "color": "#d8bf8d", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, @@ -952,6 +976,8 @@ "name": "Modified Badlands Plateau", "color": "#f2b48d", "watermodifier": "#3f76e4", + "grassmodifier": "#90814d", + "foliagemodifier": "#9e814d", "temperature": 2.0, "humidity": 0.0 }, diff --git a/identifier/biomeidentifier.cpp b/identifier/biomeidentifier.cpp index c000f6c..2c24c28 100644 --- a/identifier/biomeidentifier.cpp +++ b/identifier/biomeidentifier.cpp @@ -24,14 +24,18 @@ BiomeInfo::BiomeInfo() , enabled(false) , ocean(false) , river(false) - , swamp(false) , darkforest(false) - , badlands(false) , temperature(0.5) , humidity(0.5) , enabledwatermodifier(false) - , watermodifier(255,255,255) -{} + , enabledgrassmodifier(false) + , grassmodifier(255,255,255) + , enabledfoliagemodifier(false) + , foliagemodifier(255,255,255) +{ + // default water color for most Biomes + this->watermodifier.setRgb(0x3f, 0x76, 0xe4); +} // Biome based Grass and Foliage color is based on an interpolation in special @@ -128,16 +132,13 @@ QColor BiomeInfo::mixColor( QColor colorizer, QColor blockcolor ) QColor BiomeInfo::getBiomeGrassColor( QColor blockcolor, int elevation ) const { QColor colorizer; - // swampland - if (this->swamp) { - // perlin noise generator omitted due to performance reasons - // otherwise the random temperature distribution selects - // (below -0.1°C) 4C.76.3C or 6A.70.39 (above -0.1°C) - colorizer = QColor::fromRgb(0x6a,0x70,0x39); // hard wired - } - // mesa / badlands - else if (this->badlands) { - colorizer = QColor::fromRgb(0x90,0x81,0x4d); // hard wired + // swampland: + // perlin noise generator omitted due to performance reasons + // otherwise the random temperature distribution selects + // (below -0.1°C) 4C.76.3C or 6A.70.39 (above -0.1°C) + if (this->enabledgrassmodifier) { + // modifier color given via Biome JSON file + colorizer = grassmodifier; } else { // standard way colorizer = getBiomeColor( this->temperature, this->humidity, elevation, grassCorners ); @@ -156,16 +157,13 @@ QColor BiomeInfo::getBiomeGrassColor( QColor blockcolor, int elevation ) const QColor BiomeInfo::getBiomeFoliageColor( QColor blockcolor, int elevation ) const { QColor colorizer; - // swampland - if (this->swamp) { - colorizer = QColor::fromRgb(0x6a,0x70,0x39); // hard wired - } - // mesa / badlands - else if (this->badlands) { - colorizer = QColor::fromRgb(0x9e,0x81,0x4d); // hard wired - } else + if (this->enabledfoliagemodifier) { + // modifier color given via Biome JSON file + colorizer = foliagemodifier; + } else { // standard way colorizer = getBiomeColor( this->temperature, this->humidity, elevation, foliageCorners ); + } return mixColor( colorizer, blockcolor ); } @@ -189,7 +187,6 @@ QColor BiomeInfo::getBiomeWaterColor( QColor watercolor ) const // --------- --------- --------- --------- BiomeIdentifier::BiomeIdentifier() { - unknownBiome.watermodifier.setNamedColor("#3f76e4"); unknownBiome.enabledwatermodifier = true; for (int c = 0; c < 16; c++) unknownBiome.colors[c] = QColor(0,0,0); @@ -278,22 +275,11 @@ void BiomeIdentifier::guessSpecialBiomes(QJsonObject b, BiomeInfo *biome) } else if (biome->name.contains("river", Qt::CaseInsensitive)) { biome->river = true; } - if (b.contains("swamp")) { - biome->swamp = b.value("swamp").toBool(); - } else if (biome->name.contains("swamp", Qt::CaseInsensitive)) { - biome->swamp = true; - } if (b.contains("darkforest")) { biome->darkforest = b.value("darkforest").toBool(); } else if (biome->name.contains("dark forest", Qt::CaseInsensitive)) { biome->darkforest = true; } - if (b.contains("badlands")) { - biome->badlands = b.value("badlands").toBool(); - } else if ((biome->name.contains("mesa", Qt::CaseInsensitive)) || - (biome->name.contains("badlands", Qt::CaseInsensitive))) { - biome->badlands = true; - } } // legacy Biome definitions before Cliffs & Caves (up to 1.17) @@ -328,6 +314,20 @@ void BiomeIdentifier::parseBiomeDefinitions0000(QJsonArray data, int pack) { assert(biome->watermodifier.isValid()); } + // get grassmodifier definition + if (b.contains("grassmodifier")) { + biome->enabledgrassmodifier = true; + biome->grassmodifier.setNamedColor(b.value("grassmodifier").toString()); + assert(biome->grassmodifier.isValid()); + } + + // get foliagemodifier definition + if (b.contains("foliagemodifier")) { + biome->enabledfoliagemodifier = true; + biome->foliagemodifier.setNamedColor(b.value("foliagemodifier").toString()); + assert(biome->foliagemodifier.isValid()); + } + // get color definition QColor biomecolor; if (b.contains("color")) { @@ -395,11 +395,25 @@ void BiomeIdentifier::parseBiomeDefinitions2800(QJsonArray data18, int pack) { biome->humidity = b.value("humidity").toDouble(); // get watermodifier definition - biome->enabledwatermodifier = true; + biome->enabledwatermodifier = true; // now always used if (b.contains("watermodifier")) { biome->watermodifier.setNamedColor(b.value("watermodifier").toString()); assert(biome->watermodifier.isValid()); - } else biome->watermodifier.setNamedColor("#3f76e4"); + } + + // get grassmodifier definition + if (b.contains("grassmodifier")) { + biome->enabledgrassmodifier = true; + biome->grassmodifier.setNamedColor(b.value("grassmodifier").toString()); + assert(biome->grassmodifier.isValid()); + } + + // get foliagemodifier definition + if (b.contains("foliagemodifier")) { + biome->enabledfoliagemodifier = true; + biome->foliagemodifier.setNamedColor(b.value("foliagemodifier").toString()); + assert(biome->foliagemodifier.isValid()); + } // get color definition QColor biomecolor; diff --git a/identifier/biomeidentifier.h b/identifier/biomeidentifier.h index 8dbbdca..7b865b5 100644 --- a/identifier/biomeidentifier.h +++ b/identifier/biomeidentifier.h @@ -29,13 +29,15 @@ class BiomeInfo { bool enabled; bool ocean; bool river; - bool swamp; bool darkforest; - bool badlands; double temperature; double humidity; bool enabledwatermodifier; QColor watermodifier; + bool enabledgrassmodifier; + QColor grassmodifier; + bool enabledfoliagemodifier; + QColor foliagemodifier; QColor colors[16]; // private methods and members diff --git a/nbt/nbt.cpp b/nbt/nbt.cpp index b3e73a6..3a794bf 100644 --- a/nbt/nbt.cpp +++ b/nbt/nbt.cpp @@ -100,7 +100,7 @@ void NBT::unpack_lz4(const unsigned char * data, unsigned long length) { const unsigned char * input = data; - while ((input - data) < length) { + while (static_cast(input - data) < length) { // decode LZ4-Java block header for (int m=0; m length) return; + if ((static_cast(input - data) + length_compressed) > length) return; XXH32_hash_t checksum1;