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.nbt.CompoundTag;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.rituals.InfusionRitual; import ru.betterend.rituals.InfusionRitual;
public class InfusionPedestalEntity extends PedestalBlockEntity { public class InfusionPedestalEntity extends PedestalBlockEntity {

View file

@ -5,6 +5,7 @@ import java.util.Random;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnReason; import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.attribute.DefaultAttributeContainer; 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.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.passive.SchoolingFishEntity; import net.minecraft.entity.passive.SchoolingFishEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
@ -24,6 +24,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.ServerWorldAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.registry.EndItems;
public class EntityEndFish extends SchoolingFishEntity { public class EntityEndFish extends SchoolingFishEntity {
public static final int VARIANTS = 5; public static final int VARIANTS = 5;
@ -61,7 +62,7 @@ public class EntityEndFish extends SchoolingFishEntity {
@Override @Override
protected ItemStack getFishBucketItem() { protected ItemStack getFishBucketItem() {
return new ItemStack(Items.WATER_BUCKET); return new ItemStack(EndItems.BUCKET_END_FISH);
} }
@Override @Override
@ -115,4 +116,10 @@ public class EntityEndFish extends SchoolingFishEntity {
List<EntityEndFish> list = world.getEntitiesByClass(EntityEndFish.class, box, (entity) -> { return true; }); List<EntityEndFish> list = world.getEntitiesByClass(EntityEndFish.class, box, (entity) -> { return true; });
return list.size() < 9; 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.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.Ingredient;
import ru.betterend.interfaces.CompoundSerializer; import ru.betterend.interfaces.CompoundSerializer;
@Mixin(Ingredient.class) @Mixin(Ingredient.class)

View file

@ -9,6 +9,7 @@ public class FurnaceRecipes {
public static void register() { public static void register() {
FurnaceRecipe.make("end_lily_leaf_dried", EndItems.END_LILY_LEAF, EndItems.END_LILY_LEAF_DRIED).build(); 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", 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.JsonHelper;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.interfaces.CompoundSerializer; import ru.betterend.interfaces.CompoundSerializer;
import ru.betterend.recipe.EndRecipeManager; import ru.betterend.recipe.EndRecipeManager;

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

@ -22,8 +22,7 @@ import ru.betterend.world.features.UnderwaterPlantFeature;
import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.VineFeature;
import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantFeature;
import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.WallPlantOnLogFeature;
import ru.betterend.world.features.bushes.DragonTreeBushFeature; import ru.betterend.world.features.bushes.BushFeature;
import ru.betterend.world.features.bushes.PythadendronBushFeature;
import ru.betterend.world.features.terrain.EndLakeFeature; import ru.betterend.world.features.terrain.EndLakeFeature;
import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.RoundCaveFeature;
import ru.betterend.world.features.trees.DragonTreeFeature; 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); public static final EndFeature DRAGON_TREE = new EndFeature("dragon_tree", new DragonTreeFeature(), 3);
// Bushes // // Bushes //
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4); 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 DragonTreeBushFeature(), 15); public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15);
// Plants // // Plants //
public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); 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.EntityType;
import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.SpawnReason; import net.minecraft.entity.SpawnReason;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ArmorItem; import net.minecraft.item.ArmorItem;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.FishBucketItem;
import net.minecraft.item.FoodComponent; import net.minecraft.item.FoodComponent;
import net.minecraft.item.FoodComponents;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.Item.Settings; import net.minecraft.item.Item.Settings;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -43,12 +46,12 @@ public class EndItems {
private static final List<Item> MOD_ITEMS = Lists.newArrayList(); private static final List<Item> MOD_ITEMS = Lists.newArrayList();
// Materials // // Materials //
public final static Item ENDER_DUST = registerItem("ender_dust", new Item(makeSettings())); public final static Item ENDER_DUST = registerItem("ender_dust");
public final static Item TERMINITE_INGOT = registerItem("terminite_ingot", new Item(makeSettings())); public final static Item TERMINITE_INGOT = registerItem("terminite_ingot");
public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot", new Item(makeSettings())); public final static Item AETERNIUM_INGOT = registerItem("aeternium_ingot");
public final static Item END_LILY_LEAF = registerItem("end_lily_leaf", new Item(makeSettings())); public final static Item END_LILY_LEAF = registerItem("end_lily_leaf");
public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried", new Item(makeSettings())); public final static Item END_LILY_LEAF_DRIED = registerItem("end_lily_leaf_dried");
public final static Item CRYSTAL_SHARDS = registerItem("crystal_shards", new Item(makeSettings())); public final static Item CRYSTAL_SHARDS = registerItem("crystal_shards");
// Armor // // Armor //
public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeSettings())); public static final Item TERMINITE_HELMET = registerItem("terminite_helmet", new ArmorItem(EndArmorMaterial.TERMINITE, EquipmentSlot.HEAD, makeSettings()));
@ -81,10 +84,17 @@ public class EndItems {
// Food // // Food //
public final static Item SHADOW_BERRY_RAW = registerFood("shadow_berry_raw", 4, 0.5F); 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 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 // // Other //
public static final Item ETERNAL_CRYSTAL = registerItem("eternal_crystal", new EternalCrystal()); 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) { protected static Item registerItem(String name, Item item) {
return registerItem(BetterEnd.makeID(name), 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.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.world.World; import net.minecraft.world.World;
import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity;
import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.blocks.entities.PedestalBlockEntity;
import ru.betterend.recipe.builders.InfusionRecipe; 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.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,6 +148,8 @@ public class BlocksHelper {
doubleCheck.add(POS.toImmutable()); doubleCheck.add(POS.toImmutable());
} }
if (!state.canPlaceAt(world, POS)) {
// Chorus // Chorus
if (state.isOf(Blocks.CHORUS_PLANT)) { if (state.isOf(Blocks.CHORUS_PLANT)) {
Set<BlockPos> ends = Sets.newHashSet(); Set<BlockPos> ends = Sets.newHashSet();
@ -174,6 +177,13 @@ public class BlocksHelper {
add.clear(); add.clear();
} }
} }
// Vines
else if (state.getBlock() instanceof BlockVine) {
while (world.getBlockState(POS).getBlock() instanceof BlockVine) {
setWithoutUpdate(world, POS, AIR);
POS.setY(POS.getY() - 1);
}
}
// Liquids // Liquids
else if (!state.getFluidState().isEmpty()) { else if (!state.getFluidState().isEmpty()) {
POS.setY(y - 1); POS.setY(y - 1);
@ -232,7 +242,7 @@ public class BlocksHelper {
} }
} }
// Blocks without support // Blocks without support
else if (!state.canPlaceAt(world, POS)) { else {
// Blue Vine // Blue Vine
if (state.getBlock() instanceof BlockBlueVine) { if (state.getBlock() instanceof BlockBlueVine) {
while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) { while (state.isOf(EndBlocks.BLUE_VINE) || state.isOf(EndBlocks.BLUE_VINE_LANTERN) || state.isOf(EndBlocks.BLUE_VINE_FUR)) {
@ -263,6 +273,7 @@ public class BlocksHelper {
} }
} }
} }
}
doubleCheck.forEach((pos) -> { doubleCheck.forEach((pos) -> {
if (!world.getBlockState(pos).canPlaceAt(world, pos)) { if (!world.getBlockState(pos).canPlaceAt(world, pos)) {

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);
if (merge != TerrainMerge.NONE) {
Mutable mut = new Mutable();
int x1 = center.getX(); int x1 = center.getX();
int z1 = center.getZ(); int z1 = center.getZ();
int x2 = x1 + offset.getX(); int x2 = x1 + offset.getX();
int z2 = z1 + offset.getZ(); int z2 = z1 + offset.getZ();
if (merge != TerrainMerge.NONE) {
Mutable mut = new Mutable();
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

@ -3,6 +3,7 @@ package ru.betterend.world.features.bushes;
import java.util.Random; import java.util.Random;
import java.util.function.Function; import java.util.function.Function;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.LeavesBlock; import net.minecraft.block.LeavesBlock;
import net.minecraft.block.Material; 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.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.noise.OpenSimplexNoise;
import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper; import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper; import ru.betterend.util.MHelper;
import ru.betterend.util.sdf.SDF; 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.util.sdf.primitive.SDFSphere;
import ru.betterend.world.features.DefaultFeature; import ru.betterend.world.features.DefaultFeature;
public class DragonTreeBushFeature extends DefaultFeature { public class BushFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE; 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 @Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { 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, 3.5F, random);
float radius = MHelper.randRange(1.8F, 4.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(this.leaves);
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, stem);
for (Direction d: Direction.values()) { for (Direction d: Direction.values()) {
BlockPos p = pos.offset(d); BlockPos p = pos.offset(d);
if (world.isAir(p)) { 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

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