Fixes, structures, removed glow

This commit is contained in:
paulevsGitch 2020-11-09 00:03:48 +03:00
parent beab6ce10a
commit 687def43d1
15 changed files with 140 additions and 103 deletions

View file

@ -139,7 +139,7 @@ public class EndBlocks {
// Wall Plants // // Wall Plants //
public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new BlockWallMushroom(13)); public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new BlockWallMushroom(13));
public static final Block TAIL_MOSS = registerBlock("tail_moss", new BlockWallPlant()); public static final Block TAIL_MOSS = registerBlock("tail_moss", new BlockWallPlant());
public static final Block CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant(13)); public static final Block CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant());
// Crops // // Crops //
public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry()); public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry());

View file

@ -24,6 +24,7 @@ import net.minecraft.world.WorldAccess;
import ru.betterend.blocks.BlockBlueVine; import ru.betterend.blocks.BlockBlueVine;
import ru.betterend.blocks.basis.BlockDoublePlant; import ru.betterend.blocks.basis.BlockDoublePlant;
import ru.betterend.blocks.basis.BlockGlowingFur; import ru.betterend.blocks.basis.BlockGlowingFur;
import ru.betterend.blocks.basis.BlockVine;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags; import ru.betterend.registry.EndTags;
@ -147,117 +148,127 @@ public class BlocksHelper {
doubleCheck.add(POS.toImmutable()); doubleCheck.add(POS.toImmutable());
} }
// Chorus if (!state.canPlaceAt(world, POS)) {
if (state.isOf(Blocks.CHORUS_PLANT)) {
Set<BlockPos> ends = Sets.newHashSet(); // Chorus
Set<BlockPos> add = Sets.newHashSet(); if (state.isOf(Blocks.CHORUS_PLANT)) {
ends.add(POS.toImmutable()); Set<BlockPos> ends = Sets.newHashSet();
Set<BlockPos> add = Sets.newHashSet();
for (int i = 0; i < 64 && !ends.isEmpty(); i++) { ends.add(POS.toImmutable());
ends.forEach((pos) -> {
setWithoutUpdate(world, pos, AIR); for (int i = 0; i < 64 && !ends.isEmpty(); i++) {
for (Direction dir: HORIZONTAL) { ends.forEach((pos) -> {
BlockPos p = pos.offset(dir); setWithoutUpdate(world, pos, AIR);
for (Direction dir : HORIZONTAL) {
BlockPos p = pos.offset(dir);
BlockState st = world.getBlockState(p);
if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) {
add.add(p);
}
}
BlockPos p = pos.up();
BlockState st = world.getBlockState(p); BlockState st = world.getBlockState(p);
if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) {
add.add(p); add.add(p);
} }
} });
BlockPos p = pos.up(); ends.clear();
BlockState st = world.getBlockState(p); ends.addAll(add);
if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) { add.clear();
add.add(p); }
}
});
ends.clear();
ends.addAll(add);
add.clear();
} }
} // Vines
// Liquids else if (state.getBlock() instanceof BlockVine) {
else if (!state.getFluidState().isEmpty()) { while (world.getBlockState(POS).getBlock() instanceof BlockVine) {
POS.setY(y - 1);
if (world.isAir(POS)) {
POS.setY(y);
while (!world.getFluidState(POS).isEmpty()) {
setWithoutUpdate(world, POS, AIR); setWithoutUpdate(world, POS, AIR);
POS.setY(POS.getY() + 1);
}
continue;
}
BlockState st;
for (Direction dir: HORIZONTAL) {
if ((st = world.getBlockState(POS.offset(dir))).getMaterial().isReplaceable() && st.getFluidState().isEmpty()) {
world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0);
break;
}
}
if ((st = world.getBlockState(POS.up())).getMaterial().isReplaceable() && st.getFluidState().isEmpty()) {
world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0);
}
}
// Falling blocks
else if (state.getBlock() instanceof FallingBlock) {
BlockState falling = state;
POS.setY(POS.getY() - 1);
state = world.getBlockState(POS);
int ray = downRayRep(world, POS.toImmutable(), 64);
if (ray > 32) {
BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState());
if (world.getRandom().nextBoolean()) {
POS.setY(POS.getY() - 1); POS.setY(POS.getY() - 1);
state = world.getBlockState(POS);
BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState());
} }
} }
else { // Liquids
POS.setY(y); else if (!state.getFluidState().isEmpty()) {
boolean place = true; POS.setY(y - 1);
for (Direction dir: HORIZONTAL) { if (world.isAir(POS)) {
state = world.getBlockState(POS.offset(dir)); POS.setY(y);
if (!state.getFluidState().isEmpty()) { while (!world.getFluidState(POS).isEmpty()) {
BlocksHelper.setWithoutUpdate(world, POS, state); setWithoutUpdate(world, POS, AIR);
place = false; POS.setY(POS.getY() + 1);
}
continue;
}
BlockState st;
for (Direction dir : HORIZONTAL) {
if ((st = world.getBlockState(POS.offset(dir))).getMaterial().isReplaceable() && st.getFluidState().isEmpty()) {
world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0);
break; break;
} }
} }
if (place) { if ((st = world.getBlockState(POS.up())).getMaterial().isReplaceable() && st.getFluidState().isEmpty()) {
BlocksHelper.setWithoutUpdate(world, POS, AIR); world.getFluidTickScheduler().schedule(POS, state.getFluidState().getFluid(), 0);
} }
POS.setY(y - ray);
BlocksHelper.setWithoutUpdate(world, POS, falling);
} }
} // Falling blocks
// Blocks without support else if (state.getBlock() instanceof FallingBlock) {
else if (!state.canPlaceAt(world, POS)) { BlockState falling = state;
// Blue Vine
if (state.getBlock() instanceof BlockBlueVine) { POS.setY(POS.getY() - 1);
while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) { state = world.getBlockState(POS);
BlocksHelper.setWithoutUpdate(world, POS, AIR);
for (Direction dir : HORIZONTAL) { int ray = downRayRep(world, POS.toImmutable(), 64);
BlockPos p = POS.offset(dir); if (ray > 32) {
state = world.getBlockState(p); BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState());
if (state.getBlock() instanceof BlockGlowingFur) { if (world.getRandom().nextBoolean()) {
BlocksHelper.setWithoutUpdate(world, p, AIR); POS.setY(POS.getY() - 1);
} state = world.getBlockState(POS);
world.getBlockTickScheduler().schedule(p, world.getBlockState(p).getBlock(), 0); BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState());
} }
POS.setY(POS.getY() + 1); }
state = world.getBlockState(POS); else {
POS.setY(y);
boolean place = true;
for (Direction dir : HORIZONTAL) {
state = world.getBlockState(POS.offset(dir));
if (!state.getFluidState().isEmpty()) {
BlocksHelper.setWithoutUpdate(world, POS, state);
place = false;
break;
}
}
if (place) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
}
POS.setY(y - ray);
BlocksHelper.setWithoutUpdate(world, POS, falling);
} }
} }
// Double plants // Blocks without support
if (state.getBlock() instanceof BlockDoublePlant) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
POS.setY(POS.getY() + 1);
BlocksHelper.setWithoutUpdate(world, POS, AIR);
}
// Other blocks
else { else {
BlocksHelper.setWithoutUpdate(world, POS, AIR); // Blue Vine
if (state.getBlock() instanceof BlockBlueVine) {
while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
for (Direction dir : HORIZONTAL) {
BlockPos p = POS.offset(dir);
state = world.getBlockState(p);
if (state.getBlock() instanceof BlockGlowingFur) {
BlocksHelper.setWithoutUpdate(world, p, AIR);
}
world.getBlockTickScheduler().schedule(p, world.getBlockState(p).getBlock(), 0);
}
POS.setY(POS.getY() + 1);
state = world.getBlockState(POS);
}
}
// Double plants
if (state.getBlock() instanceof BlockDoublePlant) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
POS.setY(POS.getY() + 1);
BlocksHelper.setWithoutUpdate(world, POS, AIR);
}
// Other blocks
else {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
}
} }
} }
} }

View file

@ -95,12 +95,12 @@ public abstract class NBTStructureFeature extends DefaultFeature {
structure.place(world, center, placementData, random); structure.place(world, center, placementData, random);
TerrainMerge merge = getTerrainMerge(world, center, random); TerrainMerge merge = getTerrainMerge(world, center, random);
int x1 = center.getX();
int z1 = center.getZ();
int x2 = x1 + offset.getX();
int z2 = z1 + offset.getZ();
if (merge != TerrainMerge.NONE) { if (merge != TerrainMerge.NONE) {
Mutable mut = new Mutable(); Mutable mut = new Mutable();
int x1 = center.getX();
int z1 = center.getZ();
int x2 = x1 + offset.getX();
int z2 = z1 + offset.getZ();
if (x2 < x1) { if (x2 < x1) {
int a = x1; int a = x1;
@ -119,10 +119,10 @@ public abstract class NBTStructureFeature extends DefaultFeature {
mut.setX(x); mut.setX(x);
for (int z = z1; z <= z2; z++) { for (int z = z1; z <= z2; z++) {
mut.setZ(z); mut.setZ(z);
mut.setY(posY); mut.setY(surfMax);
BlockState state = world.getBlockState(mut); BlockState state = world.getBlockState(mut);
if (!state.isIn(EndTags.GEN_TERRAIN) && state.isSideSolidFullSquare(world, mut, Direction.DOWN)) { if (!state.isIn(EndTags.GEN_TERRAIN) && state.isSideSolidFullSquare(world, mut, Direction.DOWN)) {
for (int i = 0; i < 10; i--) { for (int i = 0; i < 10; i++) {
mut.setY(mut.getY() - 1); mut.setY(mut.getY() - 1);
BlockState stateSt = world.getBlockState(mut); BlockState stateSt = world.getBlockState(mut);
if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { if (!stateSt.isIn(EndTags.GEN_TERRAIN)) {
@ -153,6 +153,7 @@ public abstract class NBTStructureFeature extends DefaultFeature {
} }
} }
} }
BlocksHelper.fixBlocks(world, new BlockPos(x1, center.getY(), z1), new BlockPos(x2, center.getY() + offset.getY(), z2));
return true; return true;
} }

View file

@ -31,14 +31,26 @@ public class DragonTreeBushFeature extends DefaultFeature {
if (world.getBlockState(pos.down()).getBlock() != EndBlocks.SHADOW_GRASS) return false; if (world.getBlockState(pos.down()).getBlock() != EndBlocks.SHADOW_GRASS) return false;
BlockState leaves = EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1); BlockState leaves = EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1);
float radius = MHelper.randRange(1.8F, 4.5F, random); float radius = MHelper.randRange(1.8F, 3.5F, random);
OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt());
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1)); SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere); sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere);
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere); sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
sphere.setReplaceFunction(REPLACE); sphere.setReplaceFunction(REPLACE);
sphere.setPostProcess((info) -> {
if (info.getState().getBlock() instanceof LeavesBlock) {
int distance = info.getPos().getManhattanDistance(pos);
if (distance < 7) {
return info.getState().with(LeavesBlock.DISTANCE, distance);
}
else {
return AIR;
}
}
return info.getState();
});
sphere.fillRecursive(world, pos); sphere.fillRecursive(world, pos);
BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark); BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark);
for (Direction d: Direction.values()) { for (Direction d: Direction.values()) {

View file

@ -1,3 +1,3 @@
{ {
"defaultMaterial": "betterend:waving_wall_glow_inc" "defaultMaterial": "betterend:waving_wall"
} }

View file

@ -0,0 +1,13 @@
{
"structures": [
{ "nbt": "fallen_tree_1", "offsetY": 0, "terrainMerge": "object" },
{ "nbt": "fallen_tree_2", "offsetY": 0, "terrainMerge": "object" },
{ "nbt": "stump_1", "offsetY": 0, "terrainMerge": "object" },
{ "nbt": "stump_2", "offsetY": 0, "terrainMerge": "object" },
{ "nbt": "library", "offsetY": 0, "terrainMerge": "surface" },
{ "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" },
{ "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" },
{ "nbt": "ruins_3", "offsetY": 0, "terrainMerge": "surface" },
{ "nbt": "tree_house", "offsetY": 0, "terrainMerge": "surface" }
]
}