This commit is contained in:
Aleksey 2020-11-09 16:45:24 +03:00
commit 1e4b7377f2
32 changed files with 319 additions and 290 deletions

View file

@ -4,7 +4,6 @@ import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import ru.betterend.rituals.InfusionRitual;
public class InfusionPedestalEntity extends PedestalBlockEntity {

View file

@ -5,6 +5,7 @@ import java.util.Random;
import net.minecraft.block.Blocks;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.attribute.DefaultAttributeContainer;
@ -15,7 +16,6 @@ import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.passive.SchoolingFishEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundEvent;
@ -24,6 +24,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.world.ServerWorldAccess;
import net.minecraft.world.World;
import ru.betterend.registry.EndItems;
public class EntityEndFish extends SchoolingFishEntity {
public static final int VARIANTS = 5;
@ -61,7 +62,7 @@ public class EntityEndFish extends SchoolingFishEntity {
@Override
protected ItemStack getFishBucketItem() {
return new ItemStack(Items.WATER_BUCKET);
return new ItemStack(EndItems.BUCKET_END_FISH);
}
@Override
@ -115,4 +116,10 @@ public class EntityEndFish extends SchoolingFishEntity {
List<EntityEndFish> list = world.getEntitiesByClass(EntityEndFish.class, box, (entity) -> { return true; });
return list.size() < 9;
}
@Override
protected void dropLoot(DamageSource source, boolean causedByPlayer) {
ItemEntity drop = new ItemEntity(world, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW));
this.world.spawnEntity(drop);
}
}

View file

@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.recipe.Ingredient;
import ru.betterend.interfaces.CompoundSerializer;
@Mixin(Ingredient.class)

View file

@ -9,6 +9,7 @@ public class FurnaceRecipes {
public static void register() {
FurnaceRecipe.make("end_lily_leaf_dried", EndItems.END_LILY_LEAF, EndItems.END_LILY_LEAF_DRIED).build();
FurnaceRecipe.make("end_glass", EndBlocks.ENDSTONE_DUST, Blocks.GLASS).build();
FurnaceRecipe.make("end_glass", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build();
FurnaceRecipe.make("end_berry", EndItems.SHADOW_BERRY_RAW, EndItems.SHADOW_BERRY_COOKED).build();
FurnaceRecipe.make("end_fish", EndItems.END_FISH_RAW, EndItems.END_FISH_COOKED).build();
}
}

View file

@ -17,7 +17,6 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.JsonHelper;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import ru.betterend.BetterEnd;
import ru.betterend.interfaces.CompoundSerializer;
import ru.betterend.recipe.EndRecipeManager;

View file

@ -139,7 +139,7 @@ public class EndBlocks {
// Wall Plants //
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 CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant(13));
public static final Block CYAN_MOSS = registerBlock("cyan_moss", new BlockWallPlant());
// Crops //
public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new BlockShadowBerry());

View file

@ -22,8 +22,7 @@ import ru.betterend.world.features.UnderwaterPlantFeature;
import ru.betterend.world.features.VineFeature;
import ru.betterend.world.features.WallPlantFeature;
import ru.betterend.world.features.WallPlantOnLogFeature;
import ru.betterend.world.features.bushes.DragonTreeBushFeature;
import ru.betterend.world.features.bushes.PythadendronBushFeature;
import ru.betterend.world.features.bushes.BushFeature;
import ru.betterend.world.features.terrain.EndLakeFeature;
import ru.betterend.world.features.terrain.RoundCaveFeature;
import ru.betterend.world.features.trees.DragonTreeFeature;
@ -39,8 +38,8 @@ public class EndFeatures {
public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3);
// Bushes //
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4);
public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new DragonTreeBushFeature(), 15);
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4);
public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15);
// Plants //
public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5);

View file

@ -10,9 +10,12 @@ import net.minecraft.block.dispenser.ItemDispenserBehavior;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.SpawnReason;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.BlockItem;
import net.minecraft.item.FishBucketItem;
import net.minecraft.item.FoodComponent;
import net.minecraft.item.FoodComponents;
import net.minecraft.item.Item;
import net.minecraft.item.Item.Settings;
import net.minecraft.item.ItemStack;
@ -43,12 +46,12 @@ public class EndItems {
private static final List<Item> MOD_ITEMS = Lists.newArrayList();
// Materials //
public final static Item ENDER_DUST = registerItem("ender_dust", new Item(makeSettings()));
public final static Item TERMINITE_INGOT = registerItem("terminite_ingot", new Item(makeSettings()));
public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot", new Item(makeSettings()));
public final static Item END_LILY_LEAF = registerItem("end_lily_leaf", new Item(makeSettings()));
public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried", new Item(makeSettings()));
public final static Item CRYSTAL_SHARDS = registerItem("crystal_shards", new Item(makeSettings()));
public final static Item ENDER_DUST = registerItem("ender_dust");
public final static Item TERMINITE_INGOT = registerItem("terminite_ingot");
public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot");
public final static Item END_LILY_LEAF = registerItem("end_lily_leaf");
public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried");
public final static Item CRYSTAL_SHARDS = registerItem("crystal_shards");
// Armor //
public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeSettings()));
@ -81,10 +84,17 @@ public class EndItems {
// Food //
public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F);
public final static Item SHADOW_BERRY_COOKED = registerFood("shadow_berry_cooked", 6, 0.7F);
public final static Item END_FISH_RAW = registerFood("end_fish_raw", FoodComponents.SALMON);
public final static Item END_FISH_COOKED = registerFood("end_fish_cooked", FoodComponents.COOKED_SALMON);
public final static Item BUCKET_END_FISH = registerItem("bucket_end_fish", new FishBucketItem(EndEntities.END_FISH, Fluids.WATER, makeSettings()));
// Other //
public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal());
protected static Item registerItem(String name) {
return registerItem(BetterEnd.makeID(name), new Item(makeSettings()));
}
protected static Item registerItem(String name, Item item) {
return registerItem(BetterEnd.makeID(name), item);
}

View file

@ -11,7 +11,6 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import ru.betterend.blocks.entities.InfusionPedestalEntity;
import ru.betterend.blocks.entities.PedestalBlockEntity;
import ru.betterend.recipe.builders.InfusionRecipe;

View file

@ -24,6 +24,7 @@ import net.minecraft.world.WorldAccess;
import ru.betterend.blocks.BlockBlueVine;
import ru.betterend.blocks.basis.BlockDoublePlant;
import ru.betterend.blocks.basis.BlockGlowingFur;
import ru.betterend.blocks.basis.BlockVine;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags;
@ -147,117 +148,127 @@ public class BlocksHelper {
doubleCheck.add(POS.toImmutable());
}
// Chorus
if (state.isOf(Blocks.CHORUS_PLANT)) {
Set<BlockPos> ends = Sets.newHashSet();
Set<BlockPos> add = Sets.newHashSet();
ends.add(POS.toImmutable());
if (!state.canPlaceAt(world, POS)) {
for (int i = 0; i < 64 && !ends.isEmpty(); i++) {
ends.forEach((pos) -> {
setWithoutUpdate(world, pos, AIR);
for (Direction dir: HORIZONTAL) {
BlockPos p = pos.offset(dir);
// Chorus
if (state.isOf(Blocks.CHORUS_PLANT)) {
Set<BlockPos> ends = Sets.newHashSet();
Set<BlockPos> add = Sets.newHashSet();
ends.add(POS.toImmutable());
for (int i = 0; i < 64 && !ends.isEmpty(); i++) {
ends.forEach((pos) -> {
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);
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);
if ((st.isOf(Blocks.CHORUS_PLANT) || st.isOf(Blocks.CHORUS_FLOWER)) && !st.canPlaceAt(world, p)) {
add.add(p);
}
});
ends.clear();
ends.addAll(add);
add.clear();
});
ends.clear();
ends.addAll(add);
add.clear();
}
}
}
// Liquids
else if (!state.getFluidState().isEmpty()) {
POS.setY(y - 1);
if (world.isAir(POS)) {
POS.setY(y);
while (!world.getFluidState(POS).isEmpty()) {
// Vines
else if (state.getBlock() instanceof BlockVine) {
while (world.getBlockState(POS).getBlock() instanceof BlockVine) {
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);
state = world.getBlockState(POS);
BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.getDefaultState());
}
}
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;
// Liquids
else if (!state.getFluidState().isEmpty()) {
POS.setY(y - 1);
if (world.isAir(POS)) {
POS.setY(y);
while (!world.getFluidState(POS).isEmpty()) {
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 (place) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
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(y - ray);
BlocksHelper.setWithoutUpdate(world, POS, falling);
}
}
// Blocks without support
else if (!state.canPlaceAt(world, POS)) {
// 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);
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);
state = world.getBlockState(POS);
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
if (state.getBlock() instanceof BlockDoublePlant) {
BlocksHelper.setWithoutUpdate(world, POS, AIR);
POS.setY(POS.getY() + 1);
BlocksHelper.setWithoutUpdate(world, POS, AIR);
}
// Other blocks
// Blocks without support
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);
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) {
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) {
int a = x1;
@ -119,10 +119,10 @@ public abstract class NBTStructureFeature extends DefaultFeature {
mut.setX(x);
for (int z = z1; z <= z2; z++) {
mut.setZ(z);
mut.setY(posY);
mut.setY(surfMax);
BlockState state = world.getBlockState(mut);
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);
BlockState stateSt = world.getBlockState(mut);
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;
}

View file

@ -3,6 +3,7 @@ package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.LeavesBlock;
import net.minecraft.block.Material;
@ -12,7 +13,7 @@ import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
import ru.betterend.util.sdf.SDF;
@ -23,28 +24,46 @@ import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class DragonTreeBushFeature extends DefaultFeature {
public class BushFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
private final Block leaves;
private final Block stem;
public BushFeature(Block leaves, Block stem) {
this.leaves = leaves;
this.stem = stem;
}
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
if (world.getBlockState(pos.down()).getBlock() != EndBlocks.SHADOW_GRASS) return false;
if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false;
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());
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
SDF sphere = new SDFSphere().setRadius(radius).setBlock(this.leaves);
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 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.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);
BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.DRAGON_TREE.bark);
BlocksHelper.setWithoutUpdate(world, pos, stem);
for (Direction d: Direction.values()) {
BlockPos p = pos.offset(d);
if (world.isAir(p)) {
BlocksHelper.setWithoutUpdate(world, p, leaves);
BlocksHelper.setWithoutUpdate(world, p, leaves.getDefaultState().with(LeavesBlock.DISTANCE, 1));
}
}

View file

@ -1,54 +0,0 @@
package ru.betterend.world.features.bushes;
import java.util.Random;
import java.util.function.Function;
import net.minecraft.block.BlockState;
import net.minecraft.block.LeavesBlock;
import net.minecraft.block.Material;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.registry.EndBlocks;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFDisplacement;
import ru.betterend.util.sdf.operator.SDFScale3D;
import ru.betterend.util.sdf.operator.SDFSubtraction;
import ru.betterend.util.sdf.operator.SDFTranslate;
import ru.betterend.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature;
public class PythadendronBushFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
if (world.getBlockState(pos.down()).getBlock() != EndBlocks.CHORUS_NYLIUM) return false;
float radius = MHelper.randRange(1.8F, 4.5F, random);
OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt());
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
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 random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
sphere.setReplaceFunction(REPLACE);
sphere.fillRecursive(world, pos);
BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.PYTHADENDRON.bark);
return true;
}
static {
REPLACE = (state) -> {
if (state.getMaterial().equals(Material.PLANT)) {
return true;
}
return state.getMaterial().isReplaceable();
};
}
}

View file

@ -5,7 +5,7 @@
"biome.betterend.dust_wastelands": "Dust Wastelands",
"biome.betterend.chorus_forest": "Chorus Forest",
"biome.betterend.megalake": "Megalake",
"biome.betterend.crystal_mountains": "Crystal Mountains",
"biome.betterend.crystal_mountains": "Crystal Mountains",
"entity.betterend.dragonfly": "Dragonfly",
"item.betterend.spawn_egg_dragonfly": "Dragonfly Spawn Egg",
@ -198,79 +198,79 @@
"block.betterend.cave_grass": "Cave Grass",
"block.betterend.cave_bush": "Cave Bush",
"block.betterend.cave_moss_path": "Cave Moss Path",
"block.betterend.crystal_moss": "Crystal Moss",
"block.betterend.crystal_moss_path": "Crystal Moss Path",
"block.betterend.pythadendron_leaves": "Pythadendron Leaves",
"item.betterend.spawn_egg_end_fish": "End Fish Spawn Egg",
"block.betterend.cave_moss_path": "Cave Moss Path",
"block.betterend.crystal_moss": "Crystal Moss",
"block.betterend.crystal_moss_path": "Crystal Moss Path",
"block.betterend.pythadendron_leaves": "Pythadendron Leaves",
"item.betterend.spawn_egg_end_fish": "End Fish Spawn Egg",
"block.betterend.crystal_grass": "Crystal Grass",
"block.betterend.flavolite_runed": "Runed Flavolite",
"block.betterend.end_portal_block": "End Portal",
"block.betterend.eternal_pedestal": "Eternal Pedestal",
"block.betterend.eternal_pedestal": "Eternal Pedestal",
"block.betterend.flavolite_runed_eternal": "Eternal Runed Flavolite",
"item.betterend.eternal_crystal": "Eternal Crystal",
"item.betterend.eternal_crystal": "Eternal Crystal",
"block.betterend.lacugrove_bark": "Lacugrove Bark",
"block.betterend.lacugrove_barrel": "Lacugrove Barrel",
"block.betterend.lacugrove_button": "Lacugrove Button",
"block.betterend.lacugrove_chest": "Lacugrove Chest",
"block.betterend.lacugrove_crafting_table": "Lacugrove Crafting Table",
"block.betterend.lacugrove_door": "Lacugrove Door",
"block.betterend.lacugrove_fence": "Lacugrove Fence",
"block.betterend.lacugrove_gate": "Lacugrove Gate",
"block.betterend.lacugrove_ladder": "Lacugrove Ladder",
"block.betterend.lacugrove_log": "Lacugrove Log",
"block.betterend.lacugrove_planks": "Lacugrove Planks",
"block.betterend.lacugrove_plate": "Lacugrove Plate",
"block.betterend.lacugrove_sign": "Lacugrove Sign",
"block.betterend.lacugrove_slab": "Lacugrove Slab",
"block.betterend.lacugrove_stairs": "Lacugrove Stairs",
"block.betterend.lacugrove_stripped_bark": "Lacugrove Stripped Bark",
"block.betterend.lacugrove_stripped_log": "Lacugrove Stripped Log",
"block.betterend.lacugrove_trapdoor": "Lacugrove Trapdoor",
"block.betterend.lacugrove_bark": "Lacugrove Bark",
"block.betterend.lacugrove_barrel": "Lacugrove Barrel",
"block.betterend.lacugrove_button": "Lacugrove Button",
"block.betterend.lacugrove_chest": "Lacugrove Chest",
"block.betterend.lacugrove_crafting_table": "Lacugrove Crafting Table",
"block.betterend.lacugrove_door": "Lacugrove Door",
"block.betterend.lacugrove_fence": "Lacugrove Fence",
"block.betterend.lacugrove_gate": "Lacugrove Gate",
"block.betterend.lacugrove_ladder": "Lacugrove Ladder",
"block.betterend.lacugrove_log": "Lacugrove Log",
"block.betterend.lacugrove_planks": "Lacugrove Planks",
"block.betterend.lacugrove_plate": "Lacugrove Plate",
"block.betterend.lacugrove_sign": "Lacugrove Sign",
"block.betterend.lacugrove_slab": "Lacugrove Slab",
"block.betterend.lacugrove_stairs": "Lacugrove Stairs",
"block.betterend.lacugrove_stripped_bark": "Lacugrove Stripped Bark",
"block.betterend.lacugrove_stripped_log": "Lacugrove Stripped Log",
"block.betterend.lacugrove_trapdoor": "Lacugrove Trapdoor",
"block.betterend.lacugrove_leaves": "Lacugrove Leaves",
"block.betterend.lacugrove_sapling": "Lacugrove Sapling",
"block.betterend.lacugrove_leaves": "Lacugrove Leaves",
"block.betterend.lacugrove_sapling": "Lacugrove Sapling",
"biome.betterend.megalake_grove": "Megalake Grove",
"biome.betterend.painted_mountains": "Painted Mountains",
"biome.betterend.megalake_grove": "Megalake Grove",
"biome.betterend.painted_mountains": "Painted Mountains",
"block.betterend.dragon_tree_bark": "Dragon Tree Bark",
"block.betterend.dragon_tree_barrel": "Dragon Tree Barrel",
"block.betterend.dragon_tree_button": "Dragon Tree Button",
"block.betterend.dragon_tree_chest": "Dragon Tree Chest",
"block.betterend.dragon_tree_crafting_table": "Dragon Tree Crafting Table",
"block.betterend.dragon_tree_door": "Dragon Tree Door",
"block.betterend.dragon_tree_fence": "Dragon Tree Fence",
"block.betterend.dragon_tree_gate": "Dragon Tree Gate",
"block.betterend.dragon_tree_ladder": "Dragon Tree Ladder",
"block.betterend.dragon_tree_log": "Dragon Tree Log",
"block.betterend.dragon_tree_planks": "Dragon Tree Planks",
"block.betterend.dragon_tree_plate": "Dragon Tree Plate",
"block.betterend.dragon_tree_sign": "Dragon Tree Sign",
"block.betterend.dragon_tree_slab": "Dragon Tree Slab",
"block.betterend.dragon_tree_stairs": "Dragon Tree Stairs",
"block.betterend.dragon_tree_stripped_bark": "Dragon Tree Stripped Bark",
"block.betterend.dragon_tree_stripped_log": "Dragon Tree Stripped Log",
"block.betterend.dragon_tree_trapdoor": "Dragon Tree Trapdoor",
"block.betterend.dragon_tree_bark": "Dragon Tree Bark",
"block.betterend.dragon_tree_barrel": "Dragon Tree Barrel",
"block.betterend.dragon_tree_button": "Dragon Tree Button",
"block.betterend.dragon_tree_chest": "Dragon Tree Chest",
"block.betterend.dragon_tree_crafting_table": "Dragon Tree Crafting Table",
"block.betterend.dragon_tree_door": "Dragon Tree Door",
"block.betterend.dragon_tree_fence": "Dragon Tree Fence",
"block.betterend.dragon_tree_gate": "Dragon Tree Gate",
"block.betterend.dragon_tree_ladder": "Dragon Tree Ladder",
"block.betterend.dragon_tree_log": "Dragon Tree Log",
"block.betterend.dragon_tree_planks": "Dragon Tree Planks",
"block.betterend.dragon_tree_plate": "Dragon Tree Plate",
"block.betterend.dragon_tree_sign": "Dragon Tree Sign",
"block.betterend.dragon_tree_slab": "Dragon Tree Slab",
"block.betterend.dragon_tree_stairs": "Dragon Tree Stairs",
"block.betterend.dragon_tree_stripped_bark": "Dragon Tree Stripped Bark",
"block.betterend.dragon_tree_stripped_log": "Dragon Tree Stripped Log",
"block.betterend.dragon_tree_trapdoor": "Dragon Tree Trapdoor",
"biome.betterend.shadow_forest": "Shadow Forest",
"block.betterend.dragon_tree_leaves": "Dragon Tree Leaves",
"block.betterend.dragon_tree_sapling": "Dragon Tree Sapling",
"block.betterend.shadow_grass": "Shadow Grass",
"block.betterend.shadow_grass_path": "Shadow Grass Path",
"block.betterend.shadow_plant": "Shadow Plant",
"block.betterend.dragon_tree_leaves": "Dragon Tree Leaves",
"block.betterend.dragon_tree_sapling": "Dragon Tree Sapling",
"block.betterend.shadow_grass": "Shadow Grass",
"block.betterend.shadow_grass_path": "Shadow Grass Path",
"block.betterend.shadow_plant": "Shadow Plant",
"block.betterend.dragon_tree_bookshelf": "Dragon Tree Bookshelf",
"block.betterend.end_lotus_bookshelf": "End Lotus Bookshelf",
"block.betterend.lacugrove_bookshelf": "Lacugrove Bookshelf",
"block.betterend.mossy_glowshroom_bookshelf": "Mossy Glowshroom Bookshelf",
"block.betterend.pythadendron_bookshelf": "Pythadendron Bookshelf",
"block.betterend.dragon_tree_bookshelf": "Dragon Tree Bookshelf",
"block.betterend.end_lotus_bookshelf": "End Lotus Bookshelf",
"block.betterend.lacugrove_bookshelf": "Lacugrove Bookshelf",
"block.betterend.mossy_glowshroom_bookshelf": "Mossy Glowshroom Bookshelf",
"block.betterend.pythadendron_bookshelf": "Pythadendron Bookshelf",
"block.betterend.murkweed": "Murkweed",
"block.betterend.needlegrass": "Needlegrass",
"block.betterend.twisted_vine": "Twisted Vine",
"block.betterend.murkweed": "Murkweed",
"block.betterend.needlegrass": "Needlegrass",
"block.betterend.twisted_vine": "Twisted Vine",
"block.betterend.shadow_berry": "Shadow Berry Seeds",
"item.betterend.shadow_berry_cooked": "Shadow Berry Cooked",
@ -278,22 +278,26 @@
"block.betterend.purple_polypore": "Purple Polypore",
"block.betterend.cyan_moss": "Cyan Moss",
"block.betterend.tail_moss": "Tail Moss",
"block.betterend.tail_moss": "Tail Moss",
"block.betterend.flavolite_lantern": "Flavolite Lantern",
"block.betterend.end_stone_lantern": "End Stone Lantern",
"block.betterend.violecite_lantern": "Violecite Lantern",
"block.betterend.flavolite_lantern": "Flavolite Lantern",
"block.betterend.end_stone_lantern": "End Stone Lantern",
"block.betterend.violecite_lantern": "Violecite Lantern",
"biome.betterend.dragonfly": "Dragonfly",
"biome.betterend.end_fish": "End Fish",
"biome.betterend.end_slime": "End Slime",
"biome.betterend.shadow_walker": "Shadow Walker",
"item.betterend.spawn_egg_shadow_walker": "Shadow Walker Spawn Egg",
"biome.betterend.dragonfly": "Dragonfly",
"biome.betterend.end_fish": "End Fish",
"biome.betterend.end_slime": "End Slime",
"biome.betterend.shadow_walker": "Shadow Walker",
"item.betterend.spawn_egg_shadow_walker": "Shadow Walker Spawn Egg",
"block.betterend.andesite_lantern": "Andesite Lantern",
"block.betterend.blackstone_lantern": "Blackstone Lantern",
"block.betterend.diorite_lantern": "Diorite Lantern",
"block.betterend.granite_lantern": "Granite Lantern",
"block.betterend.purpur_lantern": "Purpur Lantern",
"block.betterend.quartz_lantern": "Quartz Lantern"
"block.betterend.andesite_lantern": "Andesite Lantern",
"block.betterend.blackstone_lantern": "Blackstone Lantern",
"block.betterend.diorite_lantern": "Diorite Lantern",
"block.betterend.granite_lantern": "Granite Lantern",
"block.betterend.purpur_lantern": "Purpur Lantern",
"block.betterend.quartz_lantern": "Quartz Lantern",
"item.betterend.bucket_end_fish": "End Fish Bucket",
"item.betterend.end_fish_cooked": "Cooked End Fish",
"item.betterend.end_fish_raw": "End Fish"
}

View file

@ -10,15 +10,15 @@
"entity.betterend.dragonfly": "Стрекоза",
"item.betterend.spawn_egg_dragonfly": "Яйцо призыва стрекозы",
"entity.betterend.end_slime": "Слизень края",
"item.betterend.spawn_egg_end_slime": "Яйцо призыва слизня края",
"entity.betterend.end_slime": "Слизень Края",
"item.betterend.spawn_egg_end_slime": "Яйцо призыва слизня Края",
"block.betterend.end_mycelium": "Мицелий края",
"block.betterend.end_moss": "Мох края",
"block.betterend.end_mycelium": "Мицелий Края",
"block.betterend.end_moss": "Мох Края",
"block.betterend.endstone_dust": "Эндерняковая пыль",
"block.betterend.end_mycelium_path": "Тропа из мицелия края",
"block.betterend.end_moss_path": "Тропа из мха края",
"block.betterend.end_mycelium_path": "Тропа из мицелия Края",
"block.betterend.end_moss_path": "Тропа из мха Края",
"block.betterend.ender_ore": "Руда Края",
"block.betterend.terminite_block": "Блок Терминита",
@ -170,29 +170,29 @@
"block.betterend.quartz_pedestal": "Пьедестал из кварца",
"block.betterend.infusion_pedestal": "Пьедестал Наполнения",
"block.betterend.end_lotus_seed": "Семя лотоса края",
"block.betterend.end_lotus_stem": "Стебель лотоса края",
"block.betterend.end_lotus_leaf": "Лист лотоса края",
"block.betterend.end_lotus_flower": "Цветок лотоса края",
"block.betterend.end_lotus_seed": "Семя лотоса Края",
"block.betterend.end_lotus_stem": "Стебель лотоса Края",
"block.betterend.end_lotus_leaf": "Лист лотоса Края",
"block.betterend.end_lotus_flower": "Цветок лотоса Края",
"block.betterend.end_lotus_bark": "Кора лотоса края",
"block.betterend.end_lotus_barrel": "Бочка из лотоса края",
"block.betterend.end_lotus_button": "Кнопка из лотоса края",
"block.betterend.end_lotus_chest": "Сундук из лотоса края",
"block.betterend.end_lotus_crafting_table": "Верстак из лотоса края",
"block.betterend.end_lotus_door": "Дверь из лотоса края",
"block.betterend.end_lotus_fence": "Забор из лотоса края",
"block.betterend.end_lotus_gate": "Калитка из лотоса края",
"block.betterend.end_lotus_ladder": "Лестница из лотоса края",
"block.betterend.end_lotus_log": "Бревно лотоса края",
"block.betterend.end_lotus_planks": "Доски лотоса края",
"block.betterend.end_lotus_plate": "Нажимная плита из лотоса края",
"block.betterend.end_lotus_sign": "Ьабличка из лотоса края",
"block.betterend.end_lotus_slab": "Плита из лотоса края",
"block.betterend.end_lotus_stairs": "Ступени из лотоса края",
"block.betterend.end_lotus_stripped_bark": "Обтёсанная кора лотоса края",
"block.betterend.end_lotus_stripped_log": "Обтёсанное бревно лотоса края",
"block.betterend.end_lotus_trapdoor": "Люк из лотоса края",
"block.betterend.end_lotus_bark": "Кора лотоса Края",
"block.betterend.end_lotus_barrel": "Бочка из лотоса Края",
"block.betterend.end_lotus_button": "Кнопка из лотоса Края",
"block.betterend.end_lotus_chest": "Сундук из лотоса Края",
"block.betterend.end_lotus_crafting_table": "Верстак из лотоса Края",
"block.betterend.end_lotus_door": "Дверь из лотоса Края",
"block.betterend.end_lotus_fence": "Забор из лотоса Края",
"block.betterend.end_lotus_gate": "Калитка из лотоса Края",
"block.betterend.end_lotus_ladder": "Лестница из лотоса Края",
"block.betterend.end_lotus_log": "Бревно лотоса Края",
"block.betterend.end_lotus_planks": "Доски лотоса Края",
"block.betterend.end_lotus_plate": "Нажимная плита из лотоса Края",
"block.betterend.end_lotus_sign": "Ьабличка из лотоса Края",
"block.betterend.end_lotus_slab": "Плита из лотоса Края",
"block.betterend.end_lotus_stairs": "Ступени из лотоса Края",
"block.betterend.end_lotus_stripped_bark": "Обтёсанная кора лотоса Края",
"block.betterend.end_lotus_stripped_log": "Обтёсанное бревно лотоса Края",
"block.betterend.end_lotus_trapdoor": "Люк из лотоса Края",
"block.betterend.cave_moss": "Пещерный мох",
"block.betterend.cave_grass": "Пещерная трава",
@ -265,7 +265,7 @@
"block.betterend.shadow_plant": "Теневое растение",
"block.betterend.dragon_tree_bookshelf": "Книжные полки из драконова древа",
"block.betterend.end_lotus_bookshelf": "Книжные полки из лотоса края",
"block.betterend.end_lotus_bookshelf": "Книжные полки из лотоса Края",
"block.betterend.lacugrove_bookshelf": "Книжные полки из оземангра",
"block.betterend.mossy_glowshroom_bookshelf": "Книжные полки из мшистого светогриба",
"block.betterend.pythadendron_bookshelf": "Книжные полки из пифадендрона",
@ -283,12 +283,12 @@
"block.betterend.tail_moss": "Хвостовидный мох",
"block.betterend.flavolite_lantern": "Флаволитовый фонарь",
"block.betterend.end_stone_lantern": "Фонарь из камня края",
"block.betterend.end_stone_lantern": "Фонарь из камня Края",
"block.betterend.violecite_lantern": "Виолецитовый фонарь",
"biome.betterend.dragonfly": "Стрекоза",
"biome.betterend.end_fish": "Рыба края",
"biome.betterend.end_slime": "Слизень края",
"biome.betterend.end_fish": "Рыба Края",
"biome.betterend.end_slime": "Слизень Края",
"biome.betterend.shadow_walker": "Теневой ходок",
"item.betterend.spawn_egg_shadow_walker": "Яйцо призыва теневого ходока",
@ -297,5 +297,9 @@
"block.betterend.diorite_lantern": "Диоритовый фонарь",
"block.betterend.granite_lantern": "Гранитный фонарь",
"block.betterend.purpur_lantern": "Пурпуровый фонарь",
"block.betterend.quartz_lantern": "Кварцевый фонарь"
"block.betterend.quartz_lantern": "Кварцевый фонарь",
"item.betterend.bucket_end_fish": "Ведро с рыбой Края",
"item.betterend.end_fish_cooked": "Приготовленная рыба Края",
"item.betterend.end_fish_raw": "Рыба Края"
}

View file

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

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "betterend:item/bucket_end_fish"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "betterend:item/end_fish_cooked"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "betterend:item/end_fish"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

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" }
]
}