diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/TheEndBiomeDecorator.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/TheEndBiomeDecorator.cpp')
| -rw-r--r-- | Minecraft.World/TheEndBiomeDecorator.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Minecraft.World/TheEndBiomeDecorator.cpp b/Minecraft.World/TheEndBiomeDecorator.cpp new file mode 100644 index 00000000..31823c80 --- /dev/null +++ b/Minecraft.World/TheEndBiomeDecorator.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "TheEndBiomeDecorator.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.levelgen.feature.h" +#include "net.minecraft.world.entity.boss.enderdragon.h" + + +// Spike centre positions, calculated using +// for(int i=0;i<8;i++) +// { +// int x=40 * Mth::cos(2*(-PI+(PI/8)*i)); +// int z=40* Mth::sin(2*(-PI+(PI/8)*i)); +// } + + +TheEndBiomeDecorator::SPIKE TheEndBiomeDecorator::SpikeValA[8]= +{ + // The chunk that the spike is in has to be the smallest x and z that any part of it is in + // a chunk(x,z) will only be post-processed when the chunks (x+1,z), (x,z+1) and (x+1,z+1) are also loaded + + // first two values are the smallest x and z of the chunk that the feature is in - so the centre point minus the radius + { 32, -16, 40, 0, 2 },// smallest block - 38,-2 + { 16, 16, 28, 28, 2 },// smallest block - 26,26 + { -16, 32, 0, 40, 2 },// smallest block - -2,38 + { -32, 16, -28, 28, 3 },// smallest block - -31,26 + { -48, -16, -40, 0, 3 },// smallest block - -43,-3 + { -32, -32, -28, -28, 3 },// smallest block - -31,-31 + { -16, -48, 0, -40, 4 },// smallest block - -4,-44 + { 16, -32, 28, -28, 4 },// smallest block - 24,-32 +}; + + +TheEndBiomeDecorator::TheEndBiomeDecorator(Biome *biome) : BiomeDecorator(biome) +{ + spikeFeature = new SpikeFeature(Tile::whiteStone_Id); + endPodiumFeature = new EndPodiumFeature(Tile::whiteStone_Id); +} + +void TheEndBiomeDecorator::decorate() +{ + decorateOres(); + + // this will only set the y to the top y of the chunks already processed... + int y = level->getTopSolidBlock(xo+8, zo+8); + if(y>level->GetHighestY()) level->SetHighestY(y); + + // 4J-PB - editing to place 8 spikes in a circle, with increasing height + + // are we within the chunk with a spike? + for(int i=0;i<8;i++) + { + if((xo == SpikeValA[i].iChunkX) && (zo == SpikeValA[i].iChunkZ)) + { + // in the right chunk + spikeFeature->placeWithIndex(level, random, SpikeValA[i].x, level->GetHighestY(), SpikeValA[i].z,i,SpikeValA[i].radius); + } + } + if (xo == 0 && zo == 0) + { + shared_ptr<EnderDragon> enderDragon = shared_ptr<EnderDragon>(new EnderDragon(level)); + enderDragon->moveTo(0, 128, 0, random->nextFloat() * 360, 0); + level->addEntity(enderDragon); + } + + // end podium radius is 4, position is 0,0, so chunk needs to be the -16,-16 one since this guarantees that all chunks required for the podium are loaded + if (xo == -16 && zo == -16) + { + endPodiumFeature->place(level, random, 0, Level::genDepth / 2, 0); + } +}
\ No newline at end of file |
