From 68891c120da32642f9c2001fd73329aaf671bbd7 Mon Sep 17 00:00:00 2001 From: EtlamGit Date: Sun, 6 Sep 2026 16:45:29 +0200 Subject: [PATCH] add Grass and Foliage color modifiers As more and more Biomes get individual colors for vegetation, it is better to provide config options via JSON file instead of hard coding Biomes or guess words. There are 2 new modifiers (grassmodifier and foliagemodifier) where you can place the color from the Minecraft Wiki. (reduce some warnings) --- definitions/readme_biomes.txt | 12 ++--- definitions/vanilla_biomes.json | 32 ++++++++++-- identifier/biomeidentifier.cpp | 86 +++++++++++++++++++-------------- identifier/biomeidentifier.h | 6 ++- nbt/nbt.cpp | 8 +-- 5 files changed, 93 insertions(+), 51 deletions(-) diff --git a/definitions/readme_biomes.txt b/definitions/readme_biomes.txt index 1527e4ea..53525638 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 3af113fe..205cc2f0 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 c000f6c3..2c24c286 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 8dbbdcae..7b865b5a 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 b3e73a62..3a794bf2 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;