Spike feature fixes & custom pillars
This commit is contained in:
parent
674d80a3de
commit
a0829e07ae
17 changed files with 107 additions and 38 deletions
|
@ -202,5 +202,7 @@ public class MetalMaterial {
|
|||
TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block);
|
||||
TagHelper.addTag(EndTags.IRON_INGOTS, ingot);
|
||||
TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot);
|
||||
|
||||
TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars);
|
||||
}
|
||||
}
|
|
@ -98,5 +98,7 @@ public class StoneMaterial {
|
|||
TagHelper.addTag(BlockTags.SLABS, slab, brick_slab);
|
||||
TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES);
|
||||
TagHelper.addTag(EndTags.END_STONES, stone);
|
||||
|
||||
TagHelper.addTag(EndTags.DRAGON_IMMUNE, stone, stairs, slab, wall);
|
||||
}
|
||||
}
|
|
@ -13,6 +13,8 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.block.PaneBlock;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.decoration.EndCrystalEntity;
|
||||
import net.minecraft.structure.Structure;
|
||||
import net.minecraft.structure.StructurePlacementData;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockPos.Mutable;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
@ -22,7 +24,9 @@ import net.minecraft.world.StructureWorldAccess;
|
|||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
||||
import net.minecraft.world.gen.feature.EndSpikeFeature;
|
||||
import net.minecraft.world.gen.feature.EndSpikeFeatureConfig;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.util.BlocksHelper;
|
||||
import ru.betterend.util.StructureHelper;
|
||||
import ru.betterend.world.generator.GeneratorOptions;
|
||||
|
||||
@Mixin(EndSpikeFeature.class)
|
||||
|
@ -39,50 +43,92 @@ public class EndSpikeFeatureMixin {
|
|||
int x = spike.getCenterX();
|
||||
int z = spike.getCenterZ();
|
||||
int radius = spike.getRadius();
|
||||
int minY = world.getChunk(spike.getCenterX() >> 4, spike.getCenterZ() >> 4).sampleHeightmap(Type.WORLD_SURFACE, spike.getCenterX() & 15, spike.getCenterZ() & 15) - 15;
|
||||
int maxY = minY + spike.getHeight() - 50;
|
||||
int minY = world.getChunk(x >> 4, z >> 4).sampleHeightmap(Type.WORLD_SURFACE, x & 15, z);
|
||||
int maxY = minY + spike.getHeight() - 30;
|
||||
|
||||
int r2 = radius * radius + 1;
|
||||
Mutable mut = new Mutable();
|
||||
for (int px = -radius; px <= radius; px++) {
|
||||
mut.setX(x + px);
|
||||
int x2 = px * px;
|
||||
for (int pz = -radius; pz <= radius; pz++) {
|
||||
mut.setZ(z + pz);
|
||||
int z2 = pz * pz;
|
||||
if (x2 + z2 <= r2) {
|
||||
for (int py = minY; py < maxY; py++) {
|
||||
mut.setY(py);
|
||||
if (world.getBlockState(mut).getMaterial().isReplaceable()) {
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN);
|
||||
if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) {
|
||||
radius--;
|
||||
Structure base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius));
|
||||
Structure top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : "")));
|
||||
BlockPos side = base.getSize();
|
||||
BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1));
|
||||
minY = pos1.getY() + side.getY();
|
||||
side = top.getSize();
|
||||
BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1));
|
||||
maxY = pos2.getY();
|
||||
|
||||
StructurePlacementData data = new StructurePlacementData();
|
||||
base.place(world, pos1, data, random);
|
||||
top.place(world, pos2, data, random);
|
||||
|
||||
int r2 = radius * radius + 1;
|
||||
Mutable mut = new Mutable();
|
||||
for (int px = -radius; px <= radius; px++) {
|
||||
mut.setX(x + px);
|
||||
int x2 = px * px;
|
||||
for (int pz = -radius; pz <= radius; pz++) {
|
||||
mut.setZ(z + pz);
|
||||
int z2 = pz * pz;
|
||||
if (x2 + z2 <= r2) {
|
||||
for (int py = minY; py < maxY; py++) {
|
||||
mut.setY(py);
|
||||
if (world.getBlockState(mut).getMaterial().isReplaceable()) {
|
||||
if ((px == radius || px == -radius || pz == radius || pz == -radius) && random.nextInt(24) == 0) {
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.CRYING_OBSIDIAN);
|
||||
}
|
||||
else {
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mut.setX(x);
|
||||
mut.setZ(z);
|
||||
mut.setY(maxY);
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK);
|
||||
else {
|
||||
minY -= 15;
|
||||
int r2 = radius * radius + 1;
|
||||
Mutable mut = new Mutable();
|
||||
for (int px = -radius; px <= radius; px++) {
|
||||
mut.setX(x + px);
|
||||
int x2 = px * px;
|
||||
for (int pz = -radius; pz <= radius; pz++) {
|
||||
mut.setZ(z + pz);
|
||||
int z2 = pz * pz;
|
||||
if (x2 + z2 <= r2) {
|
||||
for (int py = minY; py < maxY; py++) {
|
||||
mut.setY(py);
|
||||
if (world.getBlockState(mut).getMaterial().isReplaceable()) {
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.OBSIDIAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mut.setX(x);
|
||||
mut.setZ(z);
|
||||
mut.setY(maxY);
|
||||
BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK);
|
||||
|
||||
EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld());
|
||||
crystal.setBeamTarget(config.getPos());
|
||||
crystal.setInvulnerable(config.isCrystalInvulnerable());
|
||||
crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F);
|
||||
world.spawnEntity(crystal);
|
||||
EndCrystalEntity crystal = EntityType.END_CRYSTAL.create(world.toServerWorld());
|
||||
crystal.setBeamTarget(config.getPos());
|
||||
crystal.setInvulnerable(config.isCrystalInvulnerable());
|
||||
crystal.refreshPositionAndAngles(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F);
|
||||
world.spawnEntity(crystal);
|
||||
|
||||
if (spike.isGuarded()) {
|
||||
for (int px = -2; px <= 2; ++px) {
|
||||
boolean bl = MathHelper.abs(px) == 2;
|
||||
for (int pz = -2; pz <= 2; ++pz) {
|
||||
boolean bl2 = MathHelper.abs(pz) == 2;
|
||||
for (int py = 0; py <= 3; ++py) {
|
||||
boolean bl3 = py == 3;
|
||||
if (bl || bl2 || bl3) {
|
||||
boolean bl4 = px == -2 || px == 2 || bl3;
|
||||
boolean bl5 = pz == -2 || pz == 2 || bl3;
|
||||
BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2);
|
||||
BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState);
|
||||
if (spike.isGuarded()) {
|
||||
for (int px = -2; px <= 2; ++px) {
|
||||
boolean bl = MathHelper.abs(px) == 2;
|
||||
for (int pz = -2; pz <= 2; ++pz) {
|
||||
boolean bl2 = MathHelper.abs(pz) == 2;
|
||||
for (int py = 0; py <= 3; ++py) {
|
||||
boolean bl3 = py == 3;
|
||||
if (bl || bl2 || bl3) {
|
||||
boolean bl4 = px == -2 || px == 2 || bl3;
|
||||
boolean bl5 = pz == -2 || pz == 2 || bl3;
|
||||
BlockState blockState = (BlockState) ((BlockState) ((BlockState) ((BlockState) Blocks.IRON_BARS.getDefaultState().with(PaneBlock.NORTH, bl4 && pz != -2)).with(PaneBlock.SOUTH, bl4 && pz != 2)).with(PaneBlock.WEST, bl5 && px != -2)).with(PaneBlock.EAST, bl5 && px != 2);
|
||||
BlocksHelper.setWithoutUpdate(world, mut.set(spike.getCenterX() + px, maxY + py, spike.getCenterZ() + pz), blockState);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,4 +137,8 @@ public class EndSpikeFeatureMixin {
|
|||
|
||||
info.cancel();
|
||||
}
|
||||
|
||||
private boolean be_radiusInRange(int radius) {
|
||||
return radius > 1 && radius < 6;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ public class EndTags {
|
|||
public static final Tag.Identified<Block> PEDESTALS = makeBlockTag("pedestal");
|
||||
public static final Tag.Identified<Block> BLOCK_CHEST = makeCommonBlockTag("chest");
|
||||
public static final Tag.Identified<Block> END_STONES = makeCommonBlockTag("end_stones");
|
||||
public static final Tag.Identified<Block> DRAGON_IMMUNE = getMCBlockTag("dragon_immune");
|
||||
|
||||
// Item Tags
|
||||
public static final Tag.Identified<Item> ITEM_CHEST = makeCommonItemTag("chest");
|
||||
|
@ -70,6 +71,12 @@ public class EndTags {
|
|||
return tag == null ? (Identified<Item>) TagRegistry.item(id) : (Identified<Item>) tag;
|
||||
}
|
||||
|
||||
public static Tag.Identified<Block> getMCBlockTag(String name) {
|
||||
Identifier id = new Identifier(name);
|
||||
Tag<Block> tag = BlockTags.getTagGroup().getTag(id);
|
||||
return tag == null ? (Identified<Block>) TagRegistry.block(id) : (Identified<Block>) tag;
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
addSurfaceBlock(Blocks.END_STONE);
|
||||
addSurfaceBlock(EndBlocks.THALLASIUM.ore);
|
||||
|
@ -117,6 +124,8 @@ public class EndTags {
|
|||
|
||||
TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK);
|
||||
TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT);
|
||||
|
||||
TagHelper.addTag(EndTags.DRAGON_IMMUNE, EndBlocks.ENDER_ORE);
|
||||
}
|
||||
|
||||
public static void addSurfaceBlock(Block block) {
|
||||
|
|
|
@ -25,6 +25,7 @@ public class GeneratorOptions {
|
|||
private static BlockPos spawn;
|
||||
private static BlockPos portal = BlockPos.ORIGIN;
|
||||
private static boolean replacePortal;
|
||||
private static boolean replacePillars;
|
||||
|
||||
public static void init() {
|
||||
biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256);
|
||||
|
@ -50,6 +51,7 @@ public class GeneratorOptions {
|
|||
Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0)
|
||||
);
|
||||
replacePortal = Configs.GENERATOR_CONFIG.getBooleanRoot("customEndPortal", true);
|
||||
replacePillars = Configs.GENERATOR_CONFIG.getBooleanRoot("customObsidianSpikes", true);
|
||||
}
|
||||
|
||||
public static int getBiomeSizeLand() {
|
||||
|
@ -123,4 +125,8 @@ public class GeneratorOptions {
|
|||
public static boolean replacePortal() {
|
||||
return replacePortal;
|
||||
}
|
||||
|
||||
public static boolean replacePillars() {
|
||||
return replacePillars;
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue