11#include " SimpleCustomDimension.h"
22
3- #include " more_dimensions/MoreDimenison .h"
3+ #include " more_dimensions/MoreDimension .h"
44
55#include " magic_enum.hpp"
66
1515#include " mc/world/level/LevelSeed64.h"
1616#include " mc/world/level/biome/registry/BiomeRegistry.h"
1717#include " mc/world/level/biome/source/BiomeSource.h"
18- #include " mc/world/level/biome/source/FixedBiomeSource.h"
1918#include " mc/world/level/chunk/vanilla_level_chunk_upgrade/VanillaLevelChunkUpgrade.h"
2019#include " mc/world/level/dimension/DimensionArguments.h"
2120#include " mc/world/level/dimension/DimensionHeightRange.h"
2221#include " mc/world/level/dimension/NetherBrightnessRamp.h"
2322#include " mc/world/level/dimension/OverworldBrightnessRamp.h"
2423#include " mc/world/level/dimension/VanillaDimensions.h"
2524#include " mc/world/level/levelgen/flat/FlatWorldGenerator.h"
25+ #include " mc/world/level/levelgen/structure/EndCityFeature.h"
26+ #include " mc/world/level/levelgen/structure/StructureFeature.h"
2627#include " mc/world/level/levelgen/structure/StructureFeatureRegistry.h"
2728#include " mc/world/level/levelgen/structure/registry/StructureSetRegistry.h"
2829#include " mc/world/level/levelgen/synth/SimplexNoise.h"
3435#include " mc/world/level/storage/Experiments.h"
3536#include " mc/world/level/storage/LevelData.h"
3637
38+ #include " test/mc/FixedBiomeSource.h"
39+
40+
3741#include < memory>
3842#include < windows.h>
3943
@@ -48,6 +52,8 @@ static auto* overworldAddress =
4852 " `anonymous namespace'::unity_5c986e6b9d6571cc96912b0bfa0329e2::addStructureFeatures" _symp;
4953static auto * netherAddress = " `anonymous namespace'::unity_3da1d4c9fa90b4b1becbca96840255a5::addStructureFeatures" _symp;
5054
55+ static DWORD endcitityAddress_rva = 0x0808E70 ;
56+
5157void overworldAddStructureFeatures (
5258 StructureFeatureRegistry& registry,
5359 uint seed,
@@ -77,27 +83,54 @@ void netherAddStructureFeatures(
7783 experiments
7884 );
7985};
86+
87+ void createEndCityFeature (StructureFeatureRegistry* _this, Dimension& dimension, uint& seed){
88+
89+ HMODULE hModule = GetModuleHandle (NULL );
90+ void * endcitityAddress = (void *)((BYTE*)hModule + endcitityAddress_rva);
91+ ll::memory::addressCall<EndCityFeature&, StructureFeatureRegistry*, Dimension&, uint&>(
92+ endcitityAddress,
93+ _this,
94+ dimension,
95+ seed
96+ );
97+ };
8098} // namespace
8199
82100// static ll::Logger loggerMoreDim("SimpleCustomDim");
83- auto & loggerMoreDim = MoreDimenison ::getInstance().getSelf().getLogger();
101+ auto & loggerMoreDim = MoreDimension ::getInstance().getSelf().getLogger();
84102
85103SimpleCustomDimension::SimpleCustomDimension (std::string const & name, DimensionFactoryInfo const & info)
86104: Dimension(DimensionArguments(std::move(info.arguments), info.dimId, {-64 , 320 }, name)) {
87105 loggerMoreDim.debug (" {} dimension name:{}" , __FUNCTION__, name);
88106 mDefaultBrightness ->sky = Brightness::MAX ();
89- generatorType = *magic_enum::enum_cast<GeneratorType>((std::string_view)info.data [" generatorType" ]);
90- seed = info.data [" seed" ];
107+
108+ // Parse generatorType with error handling
109+ auto generatorTypeOpt = magic_enum::enum_cast<GeneratorType>((std::string_view)info.data [" generatorType" ]);
110+ if (!generatorTypeOpt.has_value ()) {
111+ loggerMoreDim.error (
112+ " Invalid generatorType '{}' for dimension '{}', defaulting to Overworld" ,
113+ std::string{info.data [" generatorType" ]},
114+ name
115+ );
116+ generatorType = GeneratorType::Overworld;
117+ } else {
118+ generatorType = *generatorTypeOpt;
119+ }
120+
121+ seed = info.data [" seed" ];
91122 switch (generatorType) {
92123 case GeneratorType::TheEnd: {
93124 mSeaLevel = 63 ;
94125 mHasWeather = false ;
95126 mDimensionBrightnessRamp = std::make_unique<OverworldBrightnessRamp>();
127+ break ;
96128 }
97129 case GeneratorType::Nether: {
98130 mSeaLevel = 32 ;
99131 mHasWeather = false ;
100132 mDimensionBrightnessRamp = std::make_unique<NetherBrightnessRamp>();
133+ break ;
101134 }
102135 default :
103136 mSeaLevel = 63 ;
@@ -175,6 +208,7 @@ SimpleCustomDimension::createGenerator(br::worldgen::StructureSetRegistry const&
175208 // worldGenerator->mStructureFeatureRegistry->mStructureFeatures->emplace_back(
176209 // std::make_unique<EndCityFeature>(*this, seed)
177210 // );
211+ createEndCityFeature (worldGenerator->mStructureFeatureRegistry .get (), *this , seed);
178212 break ;
179213 }
180214 case GeneratorType::Flat: {
@@ -184,11 +218,12 @@ SimpleCustomDimension::createGenerator(br::worldgen::StructureSetRegistry const&
184218 break ;
185219 }
186220 default : {
187- auto generator = std::make_unique<VoidGenerator>(*this );
188- generator->mBiome = level.getBiomeRegistry ().lookupByName (" minecraft:ocean" );
189- worldGenerator = std::move (generator);
190- worldGenerator->mStructureFeatureRegistry ->mGeneratorState ->mLevelSeed = seed;
191- worldGenerator->mStructureFeatureRegistry ->mGeneratorState ->mRingsSeed = seed;
221+ auto generator = std::make_unique<VoidGenerator>(*this );
222+ generator->mBiome = level.getBiomeRegistry ().lookupByName (" minecraft:ocean" );
223+ generator->mBiomeSource = std::make_unique<FixedBiomeSource>(*generator->mBiome );
224+ worldGenerator = std::move (generator);
225+ worldGenerator->mStructureFeatureRegistry ->mGeneratorState =
226+ br::worldgen::ChunkGeneratorStructureState::createFlat (seed, worldGenerator->getBiomeSource (), {});
192227 }
193228 }
194229 // worldGenerator->init();
0 commit comments