diff --git a/.gitignore b/.gitignore index 514dd716..f1309d16 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ bin/ run/ output/ *.log +Convert.class +ModelPart.class diff --git a/Convert.java b/Convert.java new file mode 100644 index 00000000..3de64d73 --- /dev/null +++ b/Convert.java @@ -0,0 +1,180 @@ + +class ModelPart { + static java.util.ArrayList parts = new java.util.ArrayList<>(20); + final String name; + ModelPart parent = null; + boolean mirror = false; + + float x=0, y=0, z=0, rx=0, ry=0, rz=0; + int u=0, v=0; + float bx=0,by=0,bz=0,ba=0,bb=0,bc=0; + float scale = 1; + static int wd = 64; + static int hg = 32; + + + boolean hadBox = false; + ModelPart(Convert c, String name){ + this(c, 0, 0, name); + + } + + ModelPart(Convert c, int u, int v, String name){ + this.name = name; + this.u = u; + this.v = v; + parts.add(this); + } + + ModelPart(int wd, int hg, int u, int v, String name){ + this.name = name; + this.u = u; + this.v = v; + ModelPart.wd = wd; + ModelPart.hg = hg; + parts.add(this); + } + + ModelPart setPos(float x, float y, float z){ + this.x=x; + this.y=y; + this.z=z; + return this; + } + + ModelPart setRotationAngle(float x, float y, float z){ + this.rx=x; + this.ry=y; + this.rz=z; + return this; + } + + ModelPart addChild(ModelPart p){ + p.parent = this; + return this; + } + + ModelPart texOffs(int u, int v){ + this.u=u; + this.v=v; + return this; + } + ModelPart addBox(float x, float y, float z, float a, float b, float c){ + return addBox(x, y, z, a, b, c, 1); + } + + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d){ + bx=x; + by=y; + bz=z; + ba=a; + bb=b; + bc=c; + scale = _d; + hadBox = true; + return this; + } + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d, boolean mirror){ + this.mirror = mirror; + bx=x; + by=y; + bz=z; + ba=a; + bb=b; + bc=c; + hadBox = true; + return this; + } + + public String toString(){ + String s = ""; + String pName = parent==null?"modelPartData":parent.name; + if (scale!=1){ + s += "CubeDeformation deformation_"+name+" = new CubeDeformation("+scale+"f);\n"; + } + s += "PartDefinition " + name + " = "; + s += pName+".addOrReplaceChild(\""+name+"\", CubeListBuilder.create()\n"; + if (this.mirror) s+= ".mirror()\n"; + s+= ".texOffs("+u+", "+v+")"; + if (this.hadBox) { + s+= "\n"; + if (scale!=1) + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f, deformation_"+name+"),\n"; + else + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f),\n"; + } else { + s+= ",\n"; + } + + if (x==0 && y==0 && z==0 && rx==0 && ry==0 && rz==0){ + s+= "PartPose.ZERO"; + } else if (rx==0 && ry==0 && rz==0){ + s+= "PartPose.offset("+x+"f, "+y+"f, "+z+"f)"; + } else { + s+= "PartPose.offsetAndRotation("+x+"f, "+y+"f, "+z+"f, \n"+rx+"f, "+ry+"f, "+rz+"f)"; + } + s +=");"; + + return s; + } + + public static void print(){ + System.out.println("public static LayerDefinition getTexturedModelData() {"); + System.out.println(" MeshDefinition modelData = new MeshDefinition();"); + System.out.println(" PartDefinition modelPartData = modelData.getRoot();"); + for(ModelPart p : parts){ + System.out.println(p); + System.out.println(); + } + System.out.println("return LayerDefinition.create(modelData, "+wd+", "+hg+");"); + System.out.println("}"); + + System.out.println(); + System.out.println(); + + for(ModelPart p : parts){ + String pName = p.parent==null?"modelPart":p.parent.name; + System.out.println(p.name +" = "+pName+".getChild(\""+p.name+"\");"); + } + } +} +public class Convert { + public static void main(String[] args){ + new Convert().c(); + + ModelPart.print(); + } + void setRotationAngle(ModelPart p, float x, float y, float z){ + p.setRotationAngle(x, y, z); + } + public void c (){ + float scale = 1; + ModelPart partC = new ModelPart(64, 64, 0, 19, "partC"); + partC.addBox(1.0F, 0.0F, 1.0F, 14.0F, 9.0F, 14.0F, 0.0F); + ModelPart partA = new ModelPart(64, 64, 0, 0,"partA"); + partA.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); + partA.y = 9.0F; + partA.z = 1.0F; + ModelPart partB = new ModelPart(64, 64, 0, 0, "partB"); + partB.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); + partB.y = 8.0F; + ModelPart partRightC = new ModelPart(64, 64, 0, 19, "partRightC"); + partRightC.addBox(1.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); + ModelPart partRightA = new ModelPart(64, 64, 0, 0, "partRightA"); + partRightA.addBox(1.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + partRightA.y = 9.0F; + partRightA.z = 1.0F; + ModelPart partRightB = new ModelPart(64, 64, 0, 0, "partRightB"); + partRightB.addBox(15.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + partRightB.y = 8.0F; + ModelPart partLeftC = new ModelPart(64, 64, 0, 19, "partLeftC"); + partLeftC.addBox(0.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); + ModelPart partLeftA = new ModelPart(64, 64, 0, 0, "partLeftA"); + partLeftA.addBox(0.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + partLeftA.y = 9.0F; + partLeftA.z = 1.0F; + ModelPart partLeftB = new ModelPart(64, 64, 0, 0, "partLeftB"); + partLeftB.addBox(0.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + partLeftB.y = 8.0F; + } +} diff --git a/build.gradle b/build.gradle index 9f2e81dc..f78c835e 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,7 @@ version = project.mod_version group = project.maven_group repositories { - maven { url "https://maven.dblsaiko.net/" } - maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" } + maven { url "https://maven.dblsaiko.net/" } maven { url "https://maven.fabricmc.net/" } maven { url 'https://maven.blamejared.com' } maven { url "https://maven.shedaniel.me/" } @@ -33,49 +32,56 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" + useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}" useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}" - useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" - useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" + useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" + useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}" //useOptional "grondag:canvas-mc116:${project.canvas_version}" } def useOptional(String dep) { dependencies.modRuntime (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } dependencies.modCompileOnly (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } } def useApi(String dep) { dependencies.modApi (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } } processResources { inputs.property "version", project.version - duplicatesStrategy = 'WARN' + duplicatesStrategy = 'EXCLUDE' from(sourceSets.main.resources.srcDirs) { include "fabric.mod.json" expand "version": project.version } + + from(sourceSets.main.resources.srcDirs) { + exclude "fabric.mod.json" + } } // ensure that the encoding is set to UTF-8, no matter what the system default is @@ -155,4 +161,4 @@ task release(dependsOn: [remapJar, sourcesJar, javadocJar]) { // // uncomment to publish to the local maven // // mavenLocal() // } -//} +//} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 1736bc3f..9e25e84c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,19 +3,19 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version= 1.17 +minecraft_version= 1.17.1 yarn_mappings= 6 loader_version= 0.11.6 # Mod Properties -mod_version = 0.9.8-pre +mod_version = 0.10.0-pre maven_group = ru.betterend archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -patchouli_version = 50-FABRIC -fabric_version = 0.35.2+1.17 +patchouli_version = 55-FABRIC-SNAPSHOT +fabric_version = 0.36.1+1.17 +bclib_version = 0.2.0 +rei_version = 6.0.262-alpha canvas_version = 1.0.+ -bclib_version = 0.1.38 -rei_version = 6.0.251-alpha \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 22bbaa67..6963455a 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,6 +17,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; +import java.util.Random; + public class BubbleCoralBlock extends EndUnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 0302faab..dc0ad6c3 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.renderer.block.model.BlockModel; @@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = Maps.newHashMap(); textures.put("%glow%", getGlowTexture()); diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 21a906f7..622eeb5e 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; @@ -46,11 +48,13 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return ModelsHelper.createItemModel(blockId); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern; switch (blockState.getValue(FACING)) { @@ -67,6 +71,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String state = "_wall"; BlockModelRotation rotation = BlockModelRotation.X0_Y0; diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index f8c010f1..e4ebe572 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -6,6 +6,8 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -85,6 +87,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 6d5ab346..a419608e 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -94,7 +94,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I if (exitPos == null) return; if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { ((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), - exitPos.getZ() + 0.5, entity.yRot, entity.xRot); + exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot()); } else { ((TeleportingEntity) entity).be_setExitPos(exitPos); Optional teleported = Optional.ofNullable(entity.changeDimension(destination)); @@ -114,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { if (targetWorld == null) return null; - Registry registry = targetWorld.registryAccess().dimensionTypes(); + Registry registry = targetWorld.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); ResourceLocation targetWorldId = targetWorld.dimension().location(); ResourceLocation currentWorldId = currentWorld.dimension().location(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 46e17878..8a0b9b0d 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,15 +15,11 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -38,8 +30,13 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import ru.betterend.registry.EndBlockEntities; + +import java.util.List; +import java.util.Random; public class EndStoneSmelter extends BaseBlockWithEntity { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; @@ -52,7 +49,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { .resistance(100F) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); - this.registerDefaultState(this.stateDefinition.any() + registerDefaultState(this.stateDefinition.any() .setValue(FACING, Direction.NORTH) .setValue(LIT, false)); } @@ -75,12 +72,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity { @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EndStoneSmelterBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EndStoneSmelterBlockEntity(blockPos, blockState); } @Override @@ -149,4 +146,11 @@ public class EndStoneSmelter extends BaseBlockWithEntity { world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D); } } + + + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.END_STONE_SMELTER, EndStoneSmelterBlockEntity::tick); + } } diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index e1b5404e..c3087233 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -126,8 +126,8 @@ public class EternalPedestal extends PedestalBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EternalPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EternalPedestalEntity(blockPos, blockState); } @Override diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index bba1a69d..03879d2f 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -18,8 +18,8 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.interfaces.ISpetialItem; import ru.betterend.blocks.basis.EndPlantBlock; -import ru.betterend.interfaces.ISpetialItem; public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 625d503c..2a15a97e 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -79,7 +79,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 5c82d09a..c1157780 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; @@ -26,5 +27,5 @@ public class HydraluxPetalBlock extends BaseBlock { } @Override - public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {} + public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) {} } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index f9a882b5..599bbe15 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String path = "betterend:block/block_petal_colored"; Optional pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 806455f5..96a55828 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -108,8 +108,8 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new BlockEntityHydrothermalVent(); + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BlockEntityHydrothermalVent(pos, state); } @Override diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 2604055d..4b49d48d 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -44,8 +44,8 @@ public class InfusionPedestal extends PedestalBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new InfusionPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new InfusionPedestalEntity(blockPos, blockState); } @Override diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index caf38d89..681e3578 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); return ModelsHelper.fromPattern(pattern); diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index ed04a881..ec666d67 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -14,7 +15,7 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { - EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); + EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index d644fcaf..6890f22a 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -61,7 +61,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped FluidState fluidState = world.getFluidState(blockPos2); Material material = blockState.getMaterial(); if (fluidState.is(FluidTags.WATER)) { - if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) { + if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup) blockState.getBlock()).pickupBlock(world, blockPos2, blockState).isEmpty()) { ++i; if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); @@ -73,7 +73,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped queue.add(new Tuple<>(blockPos2, j + 1)); } } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null; + BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; dropResources(blockState, world, blockPos2, blockEntity); world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 57807754..12d61fa8 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -34,7 +34,7 @@ public class NeedlegrassBlock extends EndPlantBlock { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index a769f1a3..7cfc5aa6 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -89,7 +89,7 @@ public class SilkMothHiveBlock extends BaseBlock { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 2d13649d..52e52178 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -150,7 +150,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 2bc6059b..13eb1b34 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; @@ -9,6 +7,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -17,6 +16,8 @@ import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Random; + public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); @@ -29,7 +30,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { - if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { + if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, bigPos, null))) { replaceMushroom(world, bigPos); replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.east()); @@ -37,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return; } - EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); + EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 60aac3b5..1f76d9ec 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -23,6 +23,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -56,7 +57,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { @@ -99,6 +100,6 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); + EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 67ad0a06..b267bf84 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -81,6 +81,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index e58333b7..2c337d21 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import java.util.Optional; import java.util.Random; import net.fabricmc.api.EnvType; @@ -9,9 +10,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -38,9 +42,9 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid } @Override - public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + public ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); - return Fluids.WATER; + return new ItemStack(Items.WATER_BUCKET); } @Override @@ -120,4 +124,11 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } + + + + @Override + public Optional getPickupSound() { + return Fluids.WATER.getPickupSound(); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f66fa6dc..f4ada8b3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -2,6 +2,8 @@ package ru.betterend.blocks.basis; import java.util.Map; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String floor = blockState.getValue(IS_FLOOR) ? "_floor" : ""; ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 0514f5b5..9f2b20aa 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -62,7 +62,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 886e8435..8d79e82f 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -6,10 +6,14 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; @@ -49,6 +53,7 @@ import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; +import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; @@ -349,8 +354,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new PedestalBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new PedestalBlockEntity(blockPos, blockState); } public boolean hasUniqueEntity() { @@ -370,11 +375,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return getBlockModel(blockId, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = createTexturesMap(); PedestalState state = blockState.getValue(STATE); @@ -401,6 +408,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { PedestalState state = blockState.getValue(STATE); ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), @@ -423,6 +431,22 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } }; } + + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + if (level.isClientSide) return null; + + BlockEntityTicker ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); + if (ticker!=null) return ticker; + + return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick); + } + + @Nullable + protected static BlockEntityTicker createTickerHelper(BlockEntityType blockEntityType, BlockEntityType blockEntityType2, BlockEntityTicker blockEntityTicker) { + return blockEntityType2 == blockEntityType ? (BlockEntityTicker) blockEntityTicker : null; + } static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b7319079..b8f2b7c9 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); Optional pattern = blockState.getValue(IS_FLOOR) ? diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index c42dc9e9..57df31f3 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseBarkBlock; import ru.bclib.blocks.BaseBarrelBlock; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseBookshelfBlock; +import ru.bclib.blocks.BaseChestBlock; import ru.bclib.blocks.BaseComposterBlock; import ru.bclib.blocks.BaseCraftingTableBlock; import ru.bclib.blocks.BaseDoorBlock; @@ -90,7 +91,7 @@ public class WoodenMaterial { ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks)); - chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks)); + chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks)); diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index ecce043d..cc21085d 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.entities; import java.util.List; +import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -9,8 +10,8 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -20,18 +21,16 @@ import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; -public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity { +public class BlockEntityHydrothermalVent extends BlockEntity { private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f); - public BlockEntityHydrothermalVent() { - super(EndBlockEntities.HYDROTHERMAL_VENT); + public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState); } - @Override - public void tick() { + public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { if (level != null) { - BlockState state = getBlockState(); if (state.is(EndBlocks.HYDROTHERMAL_VENT)) { boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); if (active && level.random.nextInt(20) == 0) { @@ -56,7 +55,7 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable double mult = active ? 3.0 : 5.0; float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult); entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() && - hasElytra(entity) && entity.isFallFlying()) + blockEntity.hasElytra(entity) && entity.isFallFlying()) .forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); } mutable.move(Direction.UP); diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 49516b35..91614dc5 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,15 +1,11 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -37,7 +33,6 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; @@ -46,7 +41,11 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity { +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; @@ -62,8 +61,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme private int burnTime; private int fuelTime; - public EndStoneSmelterBlockEntity() { - super(EndBlockEntities.END_STONE_SMELTER); + public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState); this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); this.propertyDelegate = new ContainerData() { @@ -225,61 +224,60 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate); } - @Override - public void tick() { - if (level == null) return; + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, EndStoneSmelterBlockEntity blockEntity) { + if (tickLevel == null) return; - boolean initialBurning = isBurning(); + boolean initialBurning = blockEntity.isBurning(); if (initialBurning) { - burnTime--; + blockEntity.burnTime--; } boolean burning = initialBurning; - if (!level.isClientSide) { - ItemStack fuel = inventory.get(2); - if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (smeltTime > 0) { - smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); + if (!tickLevel.isClientSide) { + ItemStack fuel = blockEntity.inventory.get(2); + if (!burning && (fuel.isEmpty() || blockEntity.inventory.get(0).isEmpty() && blockEntity.inventory.get(1).isEmpty())) { + if (blockEntity.smeltTime > 0) { + blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal); } } else { - Recipe recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); + Recipe recipe = tickLevel.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel).orElse(null); if (recipe == null) { - recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); + recipe = tickLevel.getRecipeManager().getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel).orElse(null); } - boolean accepted = this.canAcceptRecipeOutput(recipe); + boolean accepted = blockEntity.canAcceptRecipeOutput(recipe); if (!burning && accepted) { - burnTime = getFuelTime(fuel); - fuelTime = burnTime; - burning = isBurning(); + blockEntity.burnTime = blockEntity.getFuelTime(fuel); + blockEntity.fuelTime = blockEntity.burnTime; + burning = blockEntity.isBurning(); if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); fuel.shrink(1); if (fuel.isEmpty()) { Item remainFuel = item.getCraftingRemainingItem(); - inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + blockEntity.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); } } - setChanged(); + blockEntity.setChanged(); } } if (burning && accepted) { - this.smeltTime++; - if (smeltTime == smeltTimeTotal) { - smeltTime = 0; - smeltTimeTotal = getSmeltTime(); - craftRecipe(recipe); - setChanged(); + blockEntity.smeltTime++; + if (blockEntity.smeltTime == blockEntity.smeltTimeTotal) { + blockEntity.smeltTime = 0; + blockEntity.smeltTimeTotal = blockEntity.getSmeltTime(); + blockEntity.craftRecipe(recipe); + blockEntity.setChanged(); } } else { - smeltTime = 0; + blockEntity.smeltTime = 0; } } - + burning = blockEntity.isBurning(); if (initialBurning != burning) { - level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); - setChanged(); + tickLevel.setBlock(tickPos, tickState.setValue(EndStoneSmelter.LIT, burning), 3); + blockEntity.setChanged(); } } } @@ -395,8 +393,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(tag, inventory); burnTime = tag.getShort("BurnTime"); diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index d4da8a18..0490da3a 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -3,14 +3,15 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - public EternalPedestalEntity() { - super(EndBlockEntities.ETERNAL_PEDESTAL); + public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState); } public boolean hasRitual() { @@ -26,8 +27,13 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } @Override + public void setLevel(Level world) { + if (hasRitual()) { + linkedRitual.setWorld(world); + } + } + public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setWorld(world); } diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 2a6a4029..924c2af7 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -3,6 +3,7 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; @@ -10,13 +11,21 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; - public InfusionPedestalEntity() { - super(EndBlockEntities.INFUSION_PEDESTAL); + public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState); + } + + @Override + public void setLevel(Level world){ + super.setLevel(world); + if (hasRitual()) { + linkedRitual.setLocation(world, this.getBlockPos()); + } else { + linkRitual(new InfusionRitual(this, world, this.getBlockPos())); + } } - @Override public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setLocation(world, pos); } else { @@ -35,13 +44,12 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { public boolean hasRitual() { return linkedRitual != null; } - - @Override - public void tick() { - if (hasRitual()) { - linkedRitual.tick(); + + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, InfusionPedestalEntity blockEntity) { + if (blockEntity.hasRitual()) { + blockEntity.linkedRitual.tick(); } - super.tick(); + PedestalBlockEntity.tick(tickLevel, tickPos, tickState, blockEntity); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 5dfe65e0..27dd586e 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,30 +1,31 @@ package ru.betterend.blocks.entities; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable { +public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; private final int maxAge = 314; private int age; - - public PedestalBlockEntity() { - super(EndBlockEntities.PEDESTAL); + + public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { + this(EndBlockEntities.PEDESTAL, blockPos, blockState); } - public PedestalBlockEntity(BlockEntityType type) { - super(type); + public PedestalBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { + super(blockEntityType, blockPos, blockState); } public int getAge() { @@ -103,8 +104,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); fromTag(tag); } @@ -131,12 +132,11 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } } - @Override - public void tick() { - if (!isEmpty()) { - age++; - if (age > maxAge) { - age = 0; + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { + if (!blockEntity.isEmpty()) { + blockEntity.age++; + if (blockEntity.age > blockEntity.maxAge) { + blockEntity.age = 0; } } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 1ed760f5..7e1fe5a2 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY); + //TODO: test k=0 + this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY,0); RenderSystem.depthFunc(516); GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index c030ed9f..14ed9b49 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -32,21 +32,22 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { - recipeBook.initVisuals(narrow); + leftPos = recipeBook.updateScreenPosition(width, imageWidth); + addRenderableWidget(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + recipeBook.initVisuals(); recipeBook.toggleVisibility(); - leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + leftPos = recipeBook.updateScreenPosition( width, imageWidth); ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); })); titleLabelX = (imageWidth - font.width(title)) / 2; } @Override - public void tick() { - super.tick(); + public void containerTick() { + super.containerTick(); recipeBook.tick(); } @@ -109,8 +110,10 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { return RecipeBookType.BLAST_FURNACE; } + @Override + public boolean shouldMoveToInventory(int i) { + return i != this.getResultSlotIndex(); + } + @Override public boolean stillValid(Player player) { return inventory.stillValid(player); diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java index 212eb179..3b4d0edc 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java @@ -28,10 +28,9 @@ public class SmelterOutputSlot extends Slot { return super.remove(amount); } - public ItemStack onTake(Player player, ItemStack stack) { + public void onTake(Player player, ItemStack stack) { this.checkTakeAchievements(stack); super.onTake(player, stack); - return stack; } protected void onQuickCraft(ItemStack stack, int amount) { diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java index 6f729286..f066b38e 100644 --- a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -18,12 +19,14 @@ import net.minecraft.world.entity.player.PlayerModelPart; import net.minecraft.world.item.ItemStack; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.registry.EndEntitiesRenders; public class ArmoredElytraLayer> extends ElytraLayer { - private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); + private final ArmoredElytraModel elytraModel; - public ArmoredElytraLayer(RenderLayerParent renderLayerParent) { - super(renderLayerParent); + public ArmoredElytraLayer(RenderLayerParent renderLayerParent, EntityModelSet entityModelSet) { + super(renderLayerParent, entityModelSet); + elytraModel = new ArmoredElytraModel<>(entityModelSet.bakeLayer(EndEntitiesRenders.ARMORED_ELYTRA)); } public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index c75dfc93..abd37797 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -6,6 +6,11 @@ import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -41,14 +46,30 @@ public class EndCrystalRenderer { CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); matrices.popPose(); } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 64, 32); + } static { END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); - FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - CORE = new ModelPart(64, 32, 32, 0); - CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + FRAME = root.getChild("FRAME"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index f9100d9d..7baa3672 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -5,6 +5,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -56,15 +61,47 @@ public class EternalCrystalRenderer { return ColorUtil.toFloatArray(ColorUtil.color(r, g, b)); } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create() + .texOffs(2, 4) + .addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create() + .texOffs(2, 4) + .addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create() + .texOffs(2, 4) + .addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create() + .texOffs(2, 4) + .addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 16, 16); + } static { RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - CORE = new ModelPart(16, 16, 0, 0); - CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + SHARDS[0] = root.getChild("SHARDS_0"); + SHARDS[1] = root.getChild("SHARDS_1"); + SHARDS[2] = root.getChild("SHARDS_2"); + SHARDS[3] = root.getChild("SHARDS_3"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index e66cdee8..b5164f1b 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -10,6 +10,8 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; @@ -24,10 +26,10 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) -public class PedestalItemRenderer extends BlockEntityRenderer { +public class PedestalItemRenderer implements BlockEntityRenderer { - public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { - super(dispatcher); + public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) { + super(); } @Override @@ -44,7 +46,8 @@ public class PedestalItemRenderer extends BlockEn matrices.pushPose(); Minecraft minecraft = Minecraft.getInstance(); - BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null); + //TODO: check i=0 + BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0); Vector3f translate = model.getTransforms().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); matrices.translate(translate.x(), translate.y(), translate.z()); diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index e58053f4..794bcbf9 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -91,7 +91,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { } @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("Variant", entityData.get(VARIANT)); diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 63ff1ed3..0429c4ba 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -6,11 +6,8 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.AgableMob; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -21,7 +18,8 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.player.Player; @@ -98,18 +96,18 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; + } + + @Override + public boolean isFlying() { + return !this.onGround; } @Override @@ -168,11 +166,11 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { private Vec3 getRandomLocation() { int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16); Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F); - Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); + Vec3 airPos = HoverRandomPos.getPos(DragonflyEntity.this, 8, 7, rotation.x, rotation.z, 1.5707964F, 3, 1); if (airPos != null) { if (isInVoid(airPos)) { for (int i = 0; i < 8; i++) { - airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); + airPos = HoverRandomPos.getPos(DragonflyEntity.this, 16, 7, rotation.x, rotation.z, MHelper.PI2, 3, 1); if (airPos != null && !isInVoid(airPos)) { return airPos; } @@ -184,7 +182,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } return airPos; } - return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); + return AirAndWaterRandomPos.getPos(DragonflyEntity.this, 8, 4, -2, rotation.x, rotation.z, 1.5707963705062866D); } private boolean isInVoid(Vec3 pos) { @@ -194,7 +192,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.DRAGONFLY.create(world); } diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index dec0cad8..c0550ac2 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -88,7 +88,7 @@ public class EndFishEntity extends AbstractSchoolingFish { } @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("variant", entityData.get(VARIANT)); diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index 24662f26..48393a06 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime { } @Override - public void remove() { + public void remove(RemovalReason reason) { int i = this.getSize(); if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { Component text = this.getCustomName(); @@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime { this.level.addFreshEntity(slimeEntity); } } - this.removed = true; + + ((ISlime)this).entityRemove(reason); } @Override @@ -322,7 +323,7 @@ public class EndSlimeEntity extends Slime { return false; } else { - return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + return livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -339,7 +340,7 @@ public class EndSlimeEntity extends Slime { else if (!livingEntity.isAlive()) { return false; } - else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { + else if (livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable) { return false; } else { @@ -349,7 +350,7 @@ public class EndSlimeEntity extends Slime { public void tick() { EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage()); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.getYRot(), EndSlimeEntity.this.isDealsDamage()); } } @@ -360,7 +361,7 @@ public class EndSlimeEntity extends Slime { public EndSlimeMoveControl(EndSlimeEntity slime) { super(slime); - this.targetYaw = 180.0F * slime.yRot / 3.1415927F; + this.targetYaw = 180.0F * slime.getYRot() / 3.1415927F; } public void look(float targetYaw, boolean jumpOften) { @@ -374,9 +375,9 @@ public class EndSlimeEntity extends Slime { } public void tick() { - this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F); - this.mob.yHeadRot = this.mob.yRot; - this.mob.yBodyRot = this.mob.yRot; + this.mob.setYRot(this.rotlerp(this.mob.getYRot(), this.targetYaw, 90.0F)); + this.mob.yHeadRot = this.mob.getYRot(); + this.mob.yBodyRot = this.mob.getYRot(); if (this.operation != MoveControl.Operation.MOVE_TO) { this.mob.setZza(0.0F); } diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index 100bccac..bf5f2fd0 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -96,7 +96,7 @@ public class ShadowWalkerEntity extends Monster { } @Override - protected float getVoicePitch() { + public float getVoicePitch() { return MHelper.randRange(0.75F, 1.25F, random); } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 4c54e387..b2320f81 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -4,6 +4,9 @@ import java.util.EnumSet; import java.util.List; import java.util.Random; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; @@ -16,11 +19,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.AgableMob; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -142,18 +140,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; + } + + @Override + public boolean isFlying() { + return !this.onGround; } @Override @@ -162,7 +160,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.SILK_MOTH.create(world); } @@ -239,8 +237,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { @Nullable private Vec3 getRandomLocation() { Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); - Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); - return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1); + return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos(SilkMothEntity.this, 8, 4, -2, vec3d3.x, vec3d3.z, 1.5707963705062866D); } } @@ -299,7 +297,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(EndBlockProperties.FULLNESS, fullness)); } SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); - SilkMothEntity.this.remove(); + SilkMothEntity.this.discard(); } else { SilkMothEntity.this.hivePos = null; diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 91f0abda..86bda8c0 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -2,46 +2,66 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; public class CubozoaEntityModel extends BlockBenchModel { - private final ModelPart model; - private final ModelPart main_cube_r1; - private final ModelPart tentacle_center_1; - private final ModelPart tentacle_1; - private final ModelPart tentacle_center_2; - private final ModelPart tentacle_2; - private final ModelPart tentacle_center_3; - private final ModelPart tentacle_3; - private final ModelPart tentacle_center_4; - private final ModelPart tentacle_4; - private float scaleY; - private float scaleXZ; + private final static int TENTACLE_COUNT = 4; - public CubozoaEntityModel() { - super(RenderType::entityTranslucent); - - texWidth = 48; - texHeight = 48; - - model = new ModelPart(this); + private final ModelPart model; + private final ModelPart[] tentacle_center; + private final ModelPart[] tentacle; + private float scaleY; + private float scaleXZ; + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F)); + /*model = new ModelPart(this); model.setPos(0.0F, 24.0F, 0.0F); - model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); + model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/ - main_cube_r1 = new ModelPart(this); + bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F)); + + /*main_cube_r1 = new ModelPart(this); main_cube_r1.setPos(0.0F, -14.0F, 0.0F); model.addChild(main_cube_r1); setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); + main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/ + float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2}; - tentacle_center_1 = new ModelPart(this); + for (int i=1; i<=TENTACLE_COUNT; i++){ + PartDefinition tentaclePart = bodyPart + .addOrReplaceChild("tentacle_center_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation( + 0.0F, 0.0F, 0.0F, + 0.0F, -1.5708F, 0.0F + ) + ); + + tentaclePart.addOrReplaceChild("tentacle_"+i, CubeListBuilder.create() + .texOffs(16, 17) + .addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), + PartPose.offset(0.0F, -7.0F, 4.5F)); + } + /*tentacle_center_1 = new ModelPart(this); tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_1); - tentacle_1 = new ModelPart(this); tentacle_1.setPos(0.0F, -7.0F, 4.5F); @@ -52,7 +72,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_2); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - tentacle_2 = new ModelPart(this); tentacle_2.setPos(0.0F, -7.0F, 4.5F); @@ -63,7 +82,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_3); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - tentacle_3 = new ModelPart(this); tentacle_3.setPos(0.0F, -7.0F, 4.5F); @@ -74,31 +92,46 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_4); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - + tentacle_4 = new ModelPart(this); tentacle_4.setPos(0.0F, -7.0F, 4.5F); tentacle_center_4.addChild(tentacle_4); - tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - } - - @Override - public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = Mth.sin(animationProgress * 0.13F); - scaleY = sin * 0.1F + 0.9F; - scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - tentacle_1.xRot = sin * 0.15F; - tentacle_2.xRot = sin * 0.15F; - tentacle_3.xRot = sin * 0.15F; - tentacle_4.xRot = sin * 0.15F; - } + tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);*/ - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - matrices.pushPose(); - matrices.scale(scaleXZ, scaleY, scaleXZ); - model.render(matrices, vertices, light, overlay); - matrices.popPose(); - } + /* texWidth = 48; + texHeight = 48; */ + return LayerDefinition.create(modelData, 48, 48); + } + + public CubozoaEntityModel(ModelPart modelPart) { + super(RenderType::entityTranslucent); + tentacle = new ModelPart[TENTACLE_COUNT]; + tentacle_center = new ModelPart[TENTACLE_COUNT]; + + model = modelPart.getChild(PartNames.BODY); + for (int i=1; i<=TENTACLE_COUNT; i++){ + tentacle_center[i-1] = model.getChild("tentacle_center_"+i); + tentacle[i-1] = tentacle_center[i-1].getChild("tentacle_"+i); + } + } + + @Override + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); + scaleY = sin * 0.1F + 0.9F; + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; + + for (int i=0; i { - private final ModelPart model; - private final ModelPart head; - private final ModelPart tail; - private final ModelPart tail_2; - private final ModelPart wing_1; - private final ModelPart wing_2; - private final ModelPart wing_3; - private final ModelPart wing_4; - private final ModelPart legs_1; - private final ModelPart legs_2; + private final ModelPart model; + private final ModelPart head; + private final ModelPart tail; + private final ModelPart tail_2; + private final ModelPart wing_1; + private final ModelPart wing_2; + private final ModelPart wing_3; + private final ModelPart wing_4; + private final ModelPart legs_1; + private final ModelPart legs_2; - public DragonflyEntityModel() { - super(RenderType::entityCutout); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - texWidth = 64; - texHeight = 64; - - model = new ModelPart(this); + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), + PartPose.offset(2.0F, 21.5F, -4.0F)); + /*model = new ModelPart(this); model.setPos(2.0F, 21.5F, -4.0F); - model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); + model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);*/ - head = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() + .texOffs(17, 0) + .addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, + 0.3491F, 0.0F, 0.0F)); + /*head = new ModelPart(this); head.setPos(-2.0F, -2.0F, 0.0F); model.addChild(head); setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); + head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);*/ + PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, CubeListBuilder.create() + .texOffs(26, 0) + .addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), + PartPose.offset(-2.0F, -2.0F, 9.0F)); + /* tail = new ModelPart(this); tail.setPos(-2.0F, -2.0F, 9.0F); model.addChild(tail); tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); + */ + tailPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() + .texOffs(36, 0) + .addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), + PartPose.offset(0.0F, 0.0F, 7.0F)); + + /* tail_2 = new ModelPart(this); tail_2.setPos(0.0F, 0.0F, 7.0F); tail.addChild(tail_2); tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); + */ - wing_1 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .texOffs(0, 13) + .addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F)); + + /*wing_1 = new ModelPart(this); wing_1.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_1); - wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ - wing_2 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .texOffs(0, 13) + .addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F)); + /*wing_2 = new ModelPart(this); wing_2.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_2); wing_2.mirror = true; - wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ - wing_3 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, CubeListBuilder.create() + .texOffs(4, 17) + .addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F)); + /*wing_3 = new ModelPart(this); wing_3.setPos(-2.0F, -4.0F, 8.0F); model.addChild(wing_3); - wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ - wing_4 = new ModelPart(this); - wing_4.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_4); - wing_4.mirror = true; - wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create() + .mirror() + .texOffs(4, 17) + .addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F)); + /*wing_4 = new ModelPart(this); + wing_4.setPos(-2.0F, -4.0F, 8.0F); + model.addChild(wing_4); + wing_4.mirror = true; + wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ - legs_1 = new ModelPart(this); - legs_1.setPos(-1.0F, 0.0F, 1.0F); - model.addChild(legs_1); - setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, + 0.0F, 0.0F, -0.5236F)); + /*legs_1 = new ModelPart(this); + legs_1.setPos(-1.0F, 0.0F, 1.0F); + model.addChild(legs_1); + setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); + legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ - legs_2 = new ModelPart(this); - legs_2.setPos(-3.0F, 0.0F, 1.0F); - model.addChild(legs_2); - setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); - } + bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, + 0.0F, 0.0F, 0.5236F)); + /*legs_2 = new ModelPart(this); + legs_2.setPos(-3.0F, 0.0F, 1.0F); + model.addChild(legs_2); + setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); + legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ - @Override - public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - float progress = animationProgress * 2F; + /* + texWidth = 64; + texHeight = 64; + */ + return LayerDefinition.create(modelData, 64, 64); + } - wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; - wing_2.zRot = -wing_1.zRot; + public DragonflyEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); - wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; - wing_4.zRot = -wing_3.zRot; + model = modelPart.getChild(PartNames.BODY); + head = model.getChild(PartNames.HEAD); + tail = model.getChild(PartNames.TAIL); + tail_2 = tail.getChild(PartNames.TAIL_FIN); + wing_1 = model.getChild(PartNames.LEFT_WING); + wing_2 = model.getChild(PartNames.RIGHT_WING); + wing_3 = model.getChild(PartNames.LEFT_WING_BASE); + wing_4 = model.getChild(PartNames.RIGHT_WING_BASE); + legs_1 = model.getChild(PartNames.LEFT_LEG); + legs_2 = model.getChild(PartNames.RIGHT_LEG); + } - progress = animationProgress * 0.05F; + @Override + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + float progress = animationProgress * 2F; - head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; - tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; - tail_2.xRot = -tail.xRot * 1.5F; - } + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; + wing_2.zRot = -wing_1.zRot; - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - model.render(matrices, vertices, light, overlay); - } + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; + wing_4.zRot = -wing_3.zRot; + + progress = animationProgress * 0.05F; + + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; + tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; + tail_2.xRot = -tail.xRot * 1.5F; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + model.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index ebfe8f7b..11e402fc 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -4,6 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndFishEntity; @@ -15,47 +21,91 @@ public class EndFishEntityModel extends BlockBenchModel { private final ModelPart fin_right; private final ModelPart fin_left; - public EndFishEntityModel() { - super(RenderType::entityCutout); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - texWidth = 32; - texHeight = 32; - - model = new ModelPart(this); + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F), + PartPose.offset(0.0F, 20.0F, 0.0F)); + /*model = new ModelPart(this); model.setPos(0.0F, 20.0F, 0.0F); - model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); + model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);*/ - fin_top = new ModelPart(this); - fin_top.setPos(0.0F, -2.0F, -4.0F); + modelPartData.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create() + .texOffs(0, 6) + .addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, + -0.6981F, 0.0F, 0.0F)); + /*fin_top.setPos(0.0F, -2.0F, -4.0F); model.addChild(fin_top); setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);* + */ - fin_bottom = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.BOTTOM_FIN, CubeListBuilder.create() + .texOffs(0, 6) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, + 0.6981F, 0.0F, 0.0F)); + /*fin_bottom = new ModelPart(this); fin_bottom.setPos(0.0F, 2.0F, -4.0F); model.addChild(fin_bottom); setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*/ - flipper = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() + .texOffs(0, 15) + .addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, + -0.7854F, 0.0F, 0.0F)); + /*flipper = new ModelPart(this); flipper.setPos(0.0F, 0.0F, 2.0F); model.addChild(flipper); setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); + flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);*/ - fin_right = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.RIGHT_FIN, CubeListBuilder.create() + .texOffs(0, 25) + .addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, + 1.5708F, 0.7854F, 0.0F)); + /*fin_right = new ModelPart(this); fin_right.setPos(-1.0F, 0.0F, -1.0F); model.addChild(fin_right); setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); + fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);*/ - fin_left = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.LEFT_FIN, CubeListBuilder.create() + .mirror() + .texOffs(0, 25) + .addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, + 1.5708F, -0.7854F, 0.0F)); + /*fin_left = new ModelPart(this); fin_left.setPos(1.0F, 0.0F, -1.0F); model.addChild(fin_left); setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); + fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);*/ + + /* + texWidth = 32; + texHeight = 32; + */ + return LayerDefinition.create(modelData, 32, 32); } + public EndFishEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + model = modelPart.getChild(PartNames.BODY); + fin_top = modelPart.getChild(PartNames.TOP_FIN); + fin_bottom = modelPart.getChild(PartNames.BOTTOM_FIN); + flipper = modelPart.getChild(PartNames.TAIL_FIN); + fin_right = modelPart.getChild(PartNames.RIGHT_FIN); + fin_left = modelPart.getChild(PartNames.LEFT_FIN);} + @Override public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 5d3bb97d..f2c4c5e7 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -5,38 +5,94 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.bclib.util.MHelper; import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.registry.EndEntitiesRenders; public class EndSlimeEntityModel extends ListModel { - private final ModelPart flower; - private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; + private final ModelPart flower; + private final ModelPart crop; - public EndSlimeEntityModel(boolean onlyShell) { - super(RenderType::entityCutout); + public static LayerDefinition getShellOnlyTexturedModelData() { + return getTexturedModelData(true); + } + public static LayerDefinition getCompleteTexturedModelData() { + return getTexturedModelData(false); + } - this.innerCube = new ModelPart(this, 0, 16); - this.rightEye = new ModelPart(this, 32, 0); - this.leftEye = new ModelPart(this, 32, 4); - this.mouth = new ModelPart(this, 32, 8); - this.flower = new ModelPart(this); - this.crop = new ModelPart(this); + private static LayerDefinition getTexturedModelData(boolean onlyShell) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + //this.innerCube = new ModelPart(this, 0, 16); if (onlyShell) { - this.innerCube.texOffs(0, 0); - this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + /* this.innerCube.texOffs(0, 0); + this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/ } else { - this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); - this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), + PartPose.ZERO); + //this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.rightEye = new ModelPart(this, 32, 0); + //this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create() + .texOffs(32, 4) + .addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.leftEye = new ModelPart(this, 32, 4); + //this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create() + .texOffs(32, 8) + .addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), + PartPose.ZERO); + //this.mouth = new ModelPart(this, 32, 8); + //this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + + PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO); + PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO); + + for (int i = 0; i < 6; i++) { + final PartDefinition parent = i<4?flowerPart:cropPart; + final float rot = MHelper.degreesToRadians( i<4 ? (i * 45F) : ((i-4) * 90F + 45F) ); + + PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation(0,0,0,0,rot, 0)); + + + petalRotPart.addOrReplaceChild("petal_"+i, + CubeListBuilder.create() + .texOffs(40, 0) + .addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), + PartPose.offset(-4, 8, 0)); + } + /* this.flower = new ModelPart(this); for (int i = 0; i < 4; i++) { ModelPart petalRot = new ModelPart(this); petalRot.yRot = MHelper.degreesToRadians(i * 45F); @@ -48,6 +104,7 @@ public class EndSlimeEntityModel extends ListModel this.flower.addChild(petalRot); petalRot.addChild(petal); } + this.crop = new ModelPart(this); for (int i = 0; i < 2; i++) { ModelPart petalRot = new ModelPart(this); @@ -60,6 +117,30 @@ public class EndSlimeEntityModel extends ListModel this.crop.addChild(petalRot); petalRot.addChild(petal); } + */ + } + + return LayerDefinition.create(modelData, 64, 32); + } + + public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell){ + super(RenderType::entityCutout); + + ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL); + + innerCube = modelPart.getChild(PartNames.BODY); + if (!onlyShell) { + rightEye = modelPart.getChild(PartNames.RIGHT_EYE); + leftEye = modelPart.getChild(PartNames.LEFT_EYE); + mouth = modelPart.getChild(PartNames.MOUTH); + flower = modelPart.getChild("flower"); + crop = modelPart.getChild("crop"); + } else { + rightEye = null; + leftEye = null; + mouth = null; + flower = null; + crop = null; } } @@ -76,8 +157,16 @@ public class EndSlimeEntityModel extends ListModel crop.render(matrices, vertices, light, overlay); } + private boolean isOnlyShell(){ + return rightEye==null; + } + @Override public Iterable parts() { - return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + if (isOnlyShell()) { + return ImmutableList.of(this.innerCube); + } else { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } } } diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 5d21fafe..f50ef2c2 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -4,34 +4,150 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; public class SilkMothEntityModel extends BlockBenchModel { - private final ModelPart legsL; - private final ModelPart cube_r1; - private final ModelPart cube_r2; - private final ModelPart cube_r3; - private final ModelPart legsR; - private final ModelPart cube_r4; - private final ModelPart cube_r5; - private final ModelPart cube_r6; - private final ModelPart head_pivot; - private final ModelPart tendril_r_r1; - private final ModelPart tendril_r_r2; - private final ModelPart bb_main; - private final ModelPart wingR_r1; - private final ModelPart wingL_r1; - private final ModelPart abdomen_r1; + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; - public SilkMothEntityModel() { - super(RenderType::entityCutout); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - texWidth = 64; - texHeight = 64; + PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .texOffs(0, 0), + PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, + 0.0f, 0.0f, 0.6981f)); - legsL = new ModelPart(this); + legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create() + .texOffs(0, 13) + .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, + 0.0f, 0.2182f, 0.3927f)); + + legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create() + .texOffs(0, 15) + .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, + 0.0f, 0.0f, 0.3927f)); + + legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create() + .texOffs(0, 14) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, + 0.0f, -0.2182f, 0.3927f)); + + PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .texOffs(0, 0), + PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, + 0.0f, 3.1416f, -0.6545f)); + + legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create() + .texOffs(0, 10) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, + 0.0f, 0.2182f, 0.3927f)); + + legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create() + .texOffs(0, 11) + .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, + 0.0f, 0.0f, 0.3927f)); + + legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, + 0.0f, -0.2182f, 0.3927f)); + + PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() + .texOffs(15, 10) + .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), + PartPose.offset(0.0f, 18.0f, -3.0f)); + + head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create() + .mirror() + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, + 0.0f, 0.0f, 0.3927f)); + + head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create() + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, + 0.0f, 0.0f, -0.3927f)); + + PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(19, 19) + .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), + PartPose.offset(0.0f, 24.0f, 0.0f)); + + bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .texOffs(0, 5) + .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, + 0.0f, 0.0f, 0.3927f)); + + bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .texOffs(0, 5) + .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, + 0.0f, 0.0f, -0.3927f)); + + bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create() + .texOffs(0, 10) + .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), + PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, + -0.3927f, 0.0f, 0.0f)); + + /*texWidth = 64; + texHeight = 64;*/ + return LayerDefinition.create(modelData, 64, 64); + } + + public SilkMothEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + legsL = modelPart.getChild(PartNames.LEFT_LEG); + cube_r1 = legsL.getChild("cube_r1"); + cube_r2 = legsL.getChild("cube_r2"); + cube_r3 = legsL.getChild("cube_r3"); + legsR = modelPart.getChild(PartNames.RIGHT_LEG); + cube_r4 = legsR.getChild("cube_r4"); + cube_r5 = legsR.getChild("cube_r5"); + cube_r6 = legsR.getChild("cube_r6"); + head_pivot = modelPart.getChild(PartNames.HEAD); + tendril_r_r1 = head_pivot.getChild("tendril_r_r1"); + tendril_r_r2 = head_pivot.getChild("tendril_r_r2"); + bb_main = modelPart.getChild(PartNames.BODY); + wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING); + wingL_r1 = bb_main.getChild(PartNames.LEFT_WING); + abdomen_r1 = bb_main.getChild("abdomen_r1"); + + /*legsL = new ModelPart(this); legsL.setPos(1.5F, 19.9F, -0.45F); setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); @@ -111,28 +227,28 @@ public class SilkMothEntityModel extends BlockBenchModel { abdomen_r1.setPos(1.0F, -3.9F, 0.0F); bb_main.addChild(abdomen_r1); setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); - } + abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/ + } - @Override - public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; - wingL_r1.zRot = -wingR_r1.zRot; - head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; - tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; - tendril_r_r2.zRot = -tendril_r_r1.zRot; - abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; - legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; - legsL.zRot = -legsR.zRot; - } + @Override + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.zRot = -wingR_r1.zRot; + head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.zRot = -tendril_r_r1.zRot; + abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.zRot = -legsR.zRot; + } - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - bb_main.render(matrices, vertices, light, overlay); - head_pivot.render(matrices, vertices, light, overlay); - legsL.render(matrices, vertices, light, overlay); - legsR.render(matrices, vertices, light, overlay); - } + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 5b6b78fe..d3358b8d 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityCubozoa extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final RenderType[] GLOW = new RenderType[2]; - public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + public RendererEntityCubozoa(EntityRendererProvider.Context ctx) { + super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java index 37e82160..7d8ac881 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java @@ -2,19 +2,22 @@ package ru.betterend.entity.render; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.DragonflyEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityDragonfly extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); + public RendererEntityDragonfly(EntityRendererProvider.Context ctx) { + super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index fce70f61..767a3d74 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -6,20 +6,23 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; +import ru.betterend.entity.model.DragonflyEntityModel; import ru.betterend.entity.model.EndFishEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndFish extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; - public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + public RendererEntityEndFish(EntityRendererProvider.Context ctx) { + super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 3fad8fc1..67813e04 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndSlime extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final RenderType GLOW[] = new RenderType[4]; - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addLayer(new OverlayFeatureRenderer(this)); + public RendererEntityEndSlime(EntityRendererProvider.Context ctx) { + super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f); + this.addLayer(new OverlayFeatureRenderer(this, ctx)); this.addLayer(new EyesLayer>(this) { @Override public RenderType renderType() { @@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer extends RenderLayer> { - private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); - private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); + private final EndSlimeEntityModel modelOrdinal; + private final EndSlimeEntityModel modelLake; - public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext, EntityRendererProvider.Context ctx) { super(featureRendererContext); + modelOrdinal = new EndSlimeEntityModel<>(ctx.getModelSet(), true); + modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true); } public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index d75db944..5aa547d6 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -1,7 +1,9 @@ package ru.betterend.entity.render; import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; @@ -11,8 +13,9 @@ public class RendererEntityShadowWalker extends HumanoidMobRenderer> { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); - public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); + public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) { + super(ctx, new PlayerModel(ctx.bakeLayer(ModelLayers.PLAYER), false), 0.5F); + //super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); } @Override diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java index 7d3a2745..62f27a00 100644 --- a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -1,17 +1,20 @@ package ru.betterend.entity.render; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.SilkMothEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.SilkMothEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class SilkMothEntityRenderer extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); - public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); + public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f); } @Override diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 7306d1dd..845c63e4 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.entity.ai.behavior.ShufflingList; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import ru.bclib.api.BiomeAPI; @@ -62,7 +62,7 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } - WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + ShufflingList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); if (subBiomes != null) { subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { BCLBiome subBiome = BiomeAPI.getBiome(id); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 61e48d18..1dea5e1f 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -54,7 +54,7 @@ public class NightshadeRedwoods extends EndBiome { }); for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 27bcd5a0..acea5a96 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -16,6 +16,8 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator; import ru.bclib.BCLib; import ru.bclib.world.biomes.BCLBiomeDef; import ru.betterend.BetterEnd; @@ -24,6 +26,14 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; +class FeaturesAccesor extends Features{ + static ConfiguredDecorator shadowHEIGHTMAP_SQUARE; + + static { + shadowHEIGHTMAP_SQUARE = Decorators.HEIGHTMAP_SQUARE; + } +} + public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { super(makeDef()); @@ -54,7 +64,7 @@ public class OldBulbisGardens extends EndBiome { } for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); @@ -70,7 +80,7 @@ public class OldBulbisGardens extends EndBiome { getter = vegetal.get(i); ConfiguredFeature feature = getter.get(); ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); - feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1)); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1)); def.addFeature(Decoration.VEGETAL_DECORATION, feature); } // Grasses and other features diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4883e4a5..83ccf491 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -21,8 +22,11 @@ import ru.betterend.integration.Integrations; public class BigEtherTreeFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("ether_log"); diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 43cd3689..2ae7f845 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -15,6 +15,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,9 +36,11 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 41830663..1d4c7999 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.AABB; @@ -36,11 +37,13 @@ public class OldBulbisTreeFeature extends DefaultFeature { private static final List SIDE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; - if (!world.getBlockState(pos.below(4)).getBlock().is(TagAPI.GEN_TERRAIN)) + if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN)) return false; BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 507cfc15..0b11a5f8 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,44 +1,46 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; +import ru.betterend.registry.EndBlocks; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIAlloyingCategory implements TransferRecipeCategory { - - @Override - public @NotNull ResourceLocation getIdentifier() { - return AlloyingRecipe.ID; +public class REIAlloyingCategory implements TransferDisplayCategory { + private final EntryStack ICON; + REIAlloyingCategory(EntryStack icon){ + ICON = icon; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); + public @NotNull CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.ALLOYING; + } + + @Override + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId()); } @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.END_STONE_SMELTER; + public @NotNull EntryStack getIcon() { + return ICON; } @Override @@ -53,14 +55,14 @@ public class REIAlloyingCategory implements TransferRecipeCategory> inputEntries = display.getInputEntries(); + List inputEntries = display.getInputEntries(); widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); if (inputEntries.size() > 1) { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); } else { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); return widgets; } @@ -77,11 +79,6 @@ public class REIAlloyingCategory implements TransferRecipeCategory fuel; private Recipe recipe; - private List> input; - private List output; private float xp; private double smeltTime; + + public REIAlloyingDisplay(AlloyingRecipe recipe) { - this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getSmeltTime(); + this(recipe, recipe.getExperience(), recipe.getSmeltTime()); } - - public REIAlloyingDisplay(BlastingRecipe recipe) { + protected REIAlloyingDisplay(Recipe recipe, float xp, double smeltTime) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getCookingTime(); + this.xp = xp; + this.smeltTime = smeltTime; } - + + public static List getFuel() { return fuel; } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - - @Override - public @NotNull List> getInputEntries() { - return this.input; - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } @Override - public @NotNull ResourceLocation getRecipeCategory() { - return AlloyingRecipe.ID; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.ALLOYING; } - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } public float getXp() { return this.xp; @@ -97,14 +86,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { return 1; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + // } static { fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() - .map(Item::getDefaultInstance).map(EntryStack::create) + .map(Item::getDefaultInstance).map(EntryStacks::of) .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel") .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 8b7a552a..930d3e3e 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -1,40 +1,39 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DisplayRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.widgets.Slot; -import me.shedaniel.rei.api.widgets.Tooltip; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; - -public class REIAlloyingFuelCategory implements RecipeCategory { +public class REIAlloyingFuelCategory implements DisplayCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } @Override - public @NotNull String getCategoryName() { - return I18n.get("category.rei.fuel"); + public @NotNull Component getTitle() { + return new TranslatableComponent("category.rei.fuel"); } @Override @@ -43,12 +42,12 @@ public class REIAlloyingFuelCategory implements RecipeCategory setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + public List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); List widgets = Lists.newArrayList(); @@ -61,10 +60,10 @@ public class REIAlloyingFuelCategory implements RecipeCategory fuel, CompoundTag tag) { + this(fuel, tag.getInt("fuelTime")); + } + + public REIAlloyingFuelDisplay(List fuel, int fuelTime) { + super(fuel, Collections.emptyList()); this.fuelTime = fuelTime; } + /*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { + this.fuel = fuel; + this.fuelTime = fuelTime; + }*/ @Override - public @NotNull List> getInputEntries() { - return Collections.singletonList(Collections.singletonList(fuel)); - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.emptyList(); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index fddf1a83..92456f5a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,49 +1,54 @@ package ru.betterend.integration.rei; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.util.LangUtil; -public class REIAnvilCategory implements TransferRecipeCategory { +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class REIAnvilCategory implements TransferDisplayCategory { + private final EntryStack[] ANVILS; + + REIAnvilCategory(EntryStack[] anvils){ + ANVILS = anvils; + } @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); + public @NotNull Component getTitle() { + return new TranslatableComponent(Blocks.ANVIL.getDescriptionId()); } - + @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.ANVILS[0]; + public @NotNull EntryStack getIcon() { + return ANVILS[0]; } + @Override public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { @@ -53,23 +58,27 @@ public class REIAnvilCategory implements TransferRecipeCategory int x = startPoint.x + 10; int y = startPoint.y; widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); - List> inputEntries = display.getInputEntries(); - List materials = inputEntries.get(1); + List inputEntries = display.getInputEntries(); + EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { - Block block = ((BlockItem) anvil.getItem()).getBlock(); + List anvils = Arrays.stream(ANVILS).filter(anvil -> { + Object value = anvil.getValue(); + if (value instanceof ItemStack){ + value = ((ItemStack) value).getItem(); + } + Block block = ((BlockItem) value).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; } return anvilLevel == 1; }).collect(Collectors.toList()); - materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); + //materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); return widgets; @@ -88,11 +97,6 @@ public class REIAnvilCategory implements TransferRecipeCategory matrices.popPose(); } - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); - } - @Override public int getDisplayHeight() { return 60; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 3ca2f929..2c039d47 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -1,29 +1,27 @@ package ru.betterend.integration.rei; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.NotNull; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.AnvilRecipe; -public class REIAnvilDisplay implements TransferRecipeDisplay { +import java.util.Collections; +import java.util.Optional; + +public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final AnvilRecipe recipe; - private final List> input; - private final List output; public REIAnvilDisplay(AnvilRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); } public int getDamage() { @@ -37,31 +35,21 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public int getAnvilLevel() { return recipe.getAnvilLevel(); } - + @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @Override - public @NotNull List> getInputEntries() { - return this.input; - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } - @Override - public @NotNull List> getRequiredEntries() { - return input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return input; + // } @Override public int getWidth() { @@ -73,9 +61,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { return 1; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - AbstractContainerMenu container) { - return input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, + // AbstractContainerMenu container) { + // return input; + // } } diff --git a/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java new file mode 100644 index 00000000..3dc0fc5d --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java @@ -0,0 +1,10 @@ +package ru.betterend.integration.rei; + +import net.minecraft.world.item.crafting.BlastingRecipe; +import ru.betterend.recipe.builders.AlloyingRecipe; + +public class REIBlastingDisplay extends REIAlloyingDisplay{ + public REIBlastingDisplay(BlastingRecipe recipe) { + super(recipe, recipe.getExperience(), recipe.getCookingTime()); + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java index 9d6a0118..3b9c7299 100644 --- a/src/main/java/ru/betterend/integration/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,7 +1,5 @@ package ru.betterend.integration.rei; -import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; -import me.shedaniel.rei.server.ContainerInfoHandler; import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; @@ -9,6 +7,6 @@ public class REIContainer implements Runnable { @Override public void run() { - ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); + //ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 5acb5b12..1ab786a7 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,59 +1,59 @@ package ru.betterend.integration.rei; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; -public class REIInfusionCategory implements TransferRecipeCategory { +import java.util.List; + +public class REIInfusionCategory implements TransferDisplayCategory { private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); + private final EntryStack ICON; - @Override - public @NotNull ResourceLocation getIdentifier() { - return InfusionRecipe.ID; + REIInfusionCategory(EntryStack icon){ + ICON = icon; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + public @NotNull CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; + } + + @Override + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); } @Override - public @NotNull EntryStack getLogo() { - return REIPlugin.INFUSION_RITUAL; - } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); + public @NotNull EntryStack getIcon() { + return ICON; } + @Override public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); List widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - List> inputEntries = display.getInputEntries(); - List> outputEntries = display.getResultingEntries(); + List inputEntries = display.getInputEntries(); + List outputEntries = display.getOutputEntries(); widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); @@ -69,13 +69,14 @@ public class REIInfusionCategory implements TransferRecipeCategory widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} @Override public int getDisplayHeight() { return 104; } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) { + + } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index d8411bc9..860f386f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -1,38 +1,29 @@ package ru.betterend.integration.rei; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.recipe.builders.AlloyingRecipe; +import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.InfusionRecipe; -public class REIInfusionDisplay implements TransferRecipeDisplay { +import java.util.Collections; +import java.util.Optional; + +public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final InfusionRecipe recipe; - private final List> input; - private final List output; private final int time; public REIInfusionDisplay(InfusionRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = Lists.newArrayList(); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.time = recipe.getInfusionTime(); - - recipe.getIngredients().forEach(ingredient -> { - input.add(EntryStack.ofIngredient(ingredient)); - }); } public int getInfusionTime() { @@ -40,29 +31,19 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @Override - public @NotNull List> getInputEntries() { - return this.input; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; } - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } @Override public int getWidth() { @@ -74,8 +55,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { return 0; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + //} } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index e05fd55d..190c9c8a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,20 +1,28 @@ package ru.betterend.integration.rei; -import java.util.List; -import java.util.stream.Collectors; - import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeHelper; -import me.shedaniel.rei.api.plugins.REIPluginV0; -import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.EntryType; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.plugin.common.DefaultPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.ApiStatus; import ru.bclib.blocks.BaseFurnaceBlock; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; @@ -22,68 +30,81 @@ import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndPortals; -@Environment(EnvType.CLIENT) -public class REIPlugin implements REIPluginV0 { +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Collectors; +//https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); - public final static ResourceLocation ALLOYING = AlloyingRecipe.ID; - public final static ResourceLocation SMITHING = AnvilRecipe.ID; - public final static ResourceLocation INFUSION = InfusionRecipe.ID; + public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); + public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID; + public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); + public final static CategoryIdentifier INFUSION = InfusionRecipe.ID; - public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); - public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); - public final static EntryStack[] FURNACES; - public final static EntryStack[] ANVILS; + private EntryStack END_STONE_SMELTER; + private EntryStack INFUSION_RITUAL; + private EntryStack[] ANVILS; + private EntryStack[] FURNACES; - @Override - public ResourceLocation getPluginIdentifier() { - return PLUGIN_ID; + void init(){ + //we need to initialize those variables after the static initialization + //otherwise the registry does not know the BlockItems + if (END_STONE_SMELTER!=null) { + return; + } + + END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER); + INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); + + List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); + anvils.add(0, EntryStacks.of(Blocks.ANVIL)); + ANVILS = anvils.toArray(new EntryStack[0]); + + FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) + .toArray(new EntryStack[0]); } - + @Override - public void registerRecipeDisplays(RecipeHelper recipeHelper) { - recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); - recipeHelper.registerRecipes(SMITHING, AnvilRecipe.class, REIAnvilDisplay::new); - recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); - FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { + public void registerDisplays(DisplayRegistry registry) { + registry.registerRecipeFiller(AlloyingRecipe.class, AlloyingRecipe.TYPE, REIAlloyingDisplay::new); + registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new); + registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); + registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); + + FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { if (time >= 2000) { - recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); + final List list = Arrays.asList(EntryIngredients.of(item)); + registry.add(new REIAlloyingFuelDisplay(list, time)); } }); } @Override - public void registerOthers(RecipeHelper recipeHelper) { - recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVILS); - recipeHelper.removeAutoCraftButton(ALLOYING_FUEL); - recipeHelper.removeAutoCraftButton(SMITHING); - - recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); - recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); - } - - @Override - public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories( + public void registerCategories(CategoryRegistry registry) { + init(); + + registry.add( new REIAlloyingFuelCategory(), - new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory()); - } + new REIAlloyingCategory(END_STONE_SMELTER), + new REIInfusionCategory(INFUSION_RITUAL), + new REIAnvilCategory(ANVILS) + ); - static { - List anvils = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() - .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); - anvils.add(0, EntryStack.create(Blocks.ANVIL)); - ANVILS = anvils.toArray(new EntryStack[0]); - FURNACES = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() - .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) - .toArray(new EntryStack[0]); + registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); + registry.addWorkstations(ALLOYING, END_STONE_SMELTER); + registry.addWorkstations(INFUSION, INFUSION_RITUAL); + registry.addWorkstations(SMITHING, ANVILS); + registry.removePlusButton(ALLOYING_FUEL); + registry.removePlusButton(SMITHING); + + registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); + registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); } } diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 7df19bc6..3994ad34 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,8 @@ package ru.betterend.interfaces; +import net.minecraft.world.entity.Entity; + public interface ISlime { public void be_setSlimeSize(int size, boolean heal); + void entityRemove(Entity.RemovalReason removalReason); } diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java deleted file mode 100644 index ef19bc36..00000000 --- a/src/main/java/ru/betterend/interfaces/ISpetialItem.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.betterend.interfaces; - -public interface ISpetialItem { - public int getStackSize(); - - public boolean canPlaceOnWater(); -} diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java index b1953792..1e163318 100644 --- a/src/main/java/ru/betterend/item/ArmoredElytra.java +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -71,6 +71,6 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall @Environment(EnvType.CLIENT) public void registerModelPredicate() { FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + (itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); } } diff --git a/src/main/java/ru/betterend/item/CrystaliteElytra.java b/src/main/java/ru/betterend/item/CrystaliteElytra.java index 489eaf3f..a8995c5a 100644 --- a/src/main/java/ru/betterend/item/CrystaliteElytra.java +++ b/src/main/java/ru/betterend/item/CrystaliteElytra.java @@ -63,6 +63,6 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem, @Override public void registerModelPredicate() { FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + (itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); } } diff --git a/src/main/java/ru/betterend/item/EnchantedItem.java b/src/main/java/ru/betterend/item/EnchantedItem.java index d210c855..814b9644 100644 --- a/src/main/java/ru/betterend/item/EnchantedItem.java +++ b/src/main/java/ru/betterend/item/EnchantedItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { ResourceLocation sourceId = Registry.ITEM.getKey(source); return ModelsHelper.createItemModel(sourceId); diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java index 9b8b4d04..0b178487 100644 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -25,11 +27,14 @@ public class EndAnvilItem extends BaseAnvilItem { BlockState blockState = super.getPlacementState(blockPlaceContext); ItemStack stack = blockPlaceContext.getItemInHand(); int durability = stack.getOrCreateTag().getInt(DURABILITY); - blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); + if (blockState!=null) { + blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); + } return blockState; } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { Block block = getBlock(); ResourceLocation blockId = Registry.BLOCK.getKey(block); diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java index 7d7a729a..3886a75e 100644 --- a/src/main/java/ru/betterend/item/EndBucketItem.java +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -1,13 +1,14 @@ package ru.betterend.item; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.FishBucketItem; +import net.minecraft.world.item.MobBucketItem; import net.minecraft.world.level.material.Fluids; import ru.bclib.client.models.ItemModelProvider; import ru.betterend.registry.EndItems; -public class EndBucketItem extends FishBucketItem implements ItemModelProvider { +public class EndBucketItem extends MobBucketItem implements ItemModelProvider { public EndBucketItem(EntityType type) { - super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1)); + super(type, Fluids.WATER, SoundEvents.BUCKET_EMPTY, EndItems.makeEndItemSettings().stacksTo(1)); } } diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index d5b5c1a0..c853908f 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -4,6 +4,12 @@ import com.google.common.collect.ImmutableList; import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; @@ -12,12 +18,25 @@ public class ArmoredElytraModel extends AgeableListModel private final ModelPart rightWing; private final ModelPart leftWing; - public ArmoredElytraModel() { - this.leftWing = new ModelPart(this, 22, 0); - this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); - this.rightWing = new ModelPart(this, 22, 0); - this.rightWing.mirror = true; - this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .texOffs(22, 0) + .addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), + PartPose.ZERO); + + modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .texOffs(22, 0) + .addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 48, 48); + } + public ArmoredElytraModel(ModelPart modelPart) { + leftWing = modelPart.getChild(PartNames.LEFT_WING); + rightWing = modelPart.getChild(PartNames.RIGHT_WING); } protected Iterable headParts() { diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index b631ad7e..d1da3318 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -1,5 +1,7 @@ package ru.betterend.item.model; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.world.item.ArmorMaterial; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -7,8 +9,6 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; @@ -18,18 +18,20 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndItems; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) -public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { +public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider { + //TODO: find new registry private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); - private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); - private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); - private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); - private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); - private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); - - @Override + private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); + private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); + private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); + + //@Override public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { if (!isStackValid(stack)) return defaultTexture; @@ -37,7 +39,7 @@ public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { return FIRST_LAYER; } - @Override + //@Override public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { if (!isStackValid(stack)) return defaultModel; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index d1a37fde..525d2ced 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -5,23 +5,58 @@ import java.util.Collections; import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteBootsModel extends HumanoidModel { public ModelPart leftBoot; public ModelPart rightBoot; + + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale + 0.25f); + modelPartData.addOrReplaceChild("leftBoot", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(1.9f, 12.0f, 0.0f)); + + modelPartData.addOrReplaceChild("rightBoot", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-1.9f, 12.0f, 0.0f)); + + return LayerDefinition.create(modelData, 64, 48); + } + + public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteBootsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_BOOTS)); + } - public CrystaliteBootsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPos(1.9F, 12.0F, 0.0F); - this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + public CrystaliteBootsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + leftBoot = modelPart.getChild("leftBoot"); + rightBoot = modelPart.getChild("rightBoot"); } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 1942f9d6..058ec7d1 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -6,40 +6,95 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteChestplateModel extends HumanoidModel { public ModelPart leftShoulder; public ModelPart rightShoulder; private final boolean thinArms; - - public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.thinArms = thinArms; - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.body.setPos(0.0F, 0.0F, 0.0F); + + public static LayerDefinition getRegularTexturedModelData(){ + return getTexturedModelData(1.0f, false); + } + + public static LayerDefinition getThinTexturedModelData(){ + return getTexturedModelData(1.0f, true); + } + + private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale + 0.25F); + PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), + PartPose.ZERO); + if (thinArms) { - this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() + .mirror() + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(5.0f, 2.0f, 0.0f)); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-5.0f, 2.0f, 10.0f)); } else { - this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() + .mirror() + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(5.0f, 2.0f, 0.0f)); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-5.0f, 2.0f, 10.0f)); } + return LayerDefinition.create(modelData, 64, 48); + } + + final ModelPart localBody; + + public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet){ + return new CrystaliteChestplateModel(entityModelSet==null?getRegularTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); + } + + public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet){ + return new CrystaliteChestplateModel(entityModelSet==null?getThinTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); + } + + protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) { + super(modelPart, RenderType::entityTranslucent); + this.thinArms = thinArms; + localBody = modelPart.getChild(PartNames.BODY); + leftShoulder = modelPart.getChild("leftShoulder"); + rightShoulder = modelPart.getChild("rightShoulder"); } @Override @@ -56,7 +111,7 @@ public class CrystaliteChestplateModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, leftShoulder, rightShoulder); + return Lists.newArrayList(localBody, leftShoulder, rightShoulder); } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 3513c2f4..0c5518d0 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -7,18 +7,53 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; +import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { + final ModelPart myHat; + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - public CrystaliteHelmetModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.hat = new ModelPart(this, 0, 0); - this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); - this.hat.setPos(0.0F, 0.0F, 0.0F); + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + //modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f); + PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 64, 48); + } + + public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteHelmetModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET)); + } + + + public CrystaliteHelmetModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myHat = modelPart.getChild(PartNames.HAT); } @Override @@ -28,6 +63,6 @@ public class CrystaliteHelmetModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(hat); + return Lists.newArrayList(myHat); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index 54772ebd..0d7c6a32 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -5,23 +5,65 @@ import java.util.Collections; import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteLeggingsModel extends HumanoidModel { + public static LayerDefinition getTexturedModelData() { + float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - public CrystaliteLeggingsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.body.setPos(0.0F, 0.0F, 0.0F); - this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPos(1.9F, 12.0F, 0.0F); - this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), + PartPose.ZERO); + + modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(1.9f, 12.0f, 0.0f)); + + modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), + PartPose.offset(-1.9f, 12.0f, 0.0f)); + + return LayerDefinition.create(modelData, 64, 48); + } + + final ModelPart myBody; + final ModelPart myLeftLeg; + final ModelPart myRightLeg; + + public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteLeggingsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS)); + } + + public CrystaliteLeggingsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myBody = modelPart.getChild(PartNames.BODY); + myLeftLeg = modelPart.getChild(PartNames.LEFT_LEG); + myRightLeg = modelPart.getChild(PartNames.RIGHT_LEG); } @Override @@ -31,6 +73,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, rightLeg, leftLeg); + return Lists.newArrayList(myBody, myRightLeg, myLeftLeg); } } diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index fa990cf9..93e21ace 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -8,10 +8,13 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; import net.minecraft.tags.Tag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; @@ -38,7 +41,8 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I private final Multimap attributeModifiers; public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { - super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); + //we override all methods that access BlockTags.MINEABLE_WITH_PICKAXE in the superclass, so this should not matter + super(attackDamage, attackSpeed, material, BlockTags.MINEABLE_WITH_PICKAXE, settings); Builder builder = ImmutableMultimap.builder(); builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); @@ -133,6 +137,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return ModelsHelper.createHandheldItem(resourceLocation); } diff --git a/src/main/java/ru/betterend/minigTools.txt b/src/main/java/ru/betterend/minigTools.txt new file mode 100644 index 00000000..28523ccc --- /dev/null +++ b/src/main/java/ru/betterend/minigTools.txt @@ -0,0 +1,593 @@ +SHOVELS: + "betterend:endstone_dust", + +HOES: + "betterend:amber_root_seed", + "betterend:blossom_berry_seed", + "betterend:chorus_mushroom_seed", + "betterend:dragon_tree_leaves", + "betterend:lacugrove_leaves", + "betterend:lucernia_leaves", + "betterend:pythadendron_leaves", + "betterend:shadow_berry", + "betterend:tenanea_leaves", + +SWORDS: + +AXES: + "betterend:amaranita_cap", + "betterend:amaranita_hymenophore", + "betterend:amaranita_lantern", + "betterend:aurant_polypore", + "betterend:blue_vine_lantern", + "betterend:filalux_lantern", + "betterend:hydralux_petal_block", + "betterend:hydralux_petal_block_black", + "betterend:hydralux_petal_block_blue", + "betterend:hydralux_petal_block_brown", + "betterend:hydralux_petal_block_cyan", + "betterend:hydralux_petal_block_gray", + "betterend:hydralux_petal_block_green", + "betterend:hydralux_petal_block_light_blue", + "betterend:hydralux_petal_block_light_gray", + "betterend:hydralux_petal_block_lime", + "betterend:hydralux_petal_block_magenta", + "betterend:hydralux_petal_block_orange", + "betterend:hydralux_petal_block_pink", + "betterend:hydralux_petal_block_purple", + "betterend:hydralux_petal_block_red", + "betterend:hydralux_petal_block_white", + "betterend:hydralux_petal_block_yellow", + "betterend:mossy_glowshroom_cap", + "betterend:mossy_glowshroom_hymenophore", + "betterend:purple_polypore", + +SHEARS: + "betterend:aeridium", + "betterend:amaranita_fur", + "betterend:amber_grass", + "betterend:blooming_cooksonia", + "betterend:blue_vine_fur", + "betterend:blue_vine_seed", + "betterend:bolux_mushroom", + "betterend:bubble_coral", + "betterend:bulb_moss", + "betterend:bulb_vine", + "betterend:bulb_vine_seed", + "betterend:bushy_grass", + "betterend:cave_grass", + "betterend:cave_pumpkin_seed", + "betterend:charnia_cyan", + "betterend:charnia_green", + "betterend:charnia_light_blue", + "betterend:charnia_orange", + "betterend:charnia_purple", + "betterend:charnia_red", + "betterend:chorus_grass", + "betterend:clawfern", + "betterend:creeping_moss", + "betterend:crystal_grass", + "betterend:cyan_moss", + "betterend:dense_vine", + "betterend:dragon_tree_leaves", + "betterend:end_lily_seed", + "betterend:end_lotus_seed", + "betterend:filalux", + "betterend:filalux_wings", + "betterend:flamaea", + "betterend:fracturn", + "betterend:globulagus", + "betterend:glowing_pillar_leaves", + "betterend:glowing_pillar_luminophor", + "betterend:glowing_pillar_seed", + "betterend:helix_tree_leaves", + "betterend:hydralux_sapling", + "betterend:jungle_fern", + "betterend:jungle_grass", + "betterend:jungle_vine", + "betterend:lacugrove_leaves", + "betterend:lamellarium", + "betterend:lanceleaf_seed", + "betterend:lucernia_leaves", + "betterend:lucernia_outer_leaves", + "betterend:lumecorn_seed", + "betterend:lutebus", + "betterend:magnula", + "betterend:mossy_glowshroom_fur", + "betterend:murkweed", + "betterend:needlegrass", + "betterend:orango", + "betterend:pond_anemone", + "betterend:pythadendron_leaves", + "betterend:rubinea", + "betterend:ruscus", + "betterend:salteago", + "betterend:shadow_plant", + "betterend:small_amaranita_mushroom", + "betterend:small_jellyshroom", + "betterend:tail_moss", + "betterend:tenanea_flowers", + "betterend:tenanea_leaves", + "betterend:tenanea_outer_leaves", + "betterend:tube_worm", + "betterend:twisted_moss", + "betterend:twisted_umbrella_moss", + "betterend:twisted_umbrella_moss_tall", + "betterend:twisted_vine", + "betterend:umbrella_moss", + "betterend:umbrella_moss_tall", + "betterend:vaiolush_fern", + +UNKNOWN: + "betterend:aurora_crystal", + +MISSING: + "betterend:amber_ore", + "betterend:end_stone_stalactite", + "betterend:end_stone_stalactite_cavemoss", + "betterend:ender_ore", + +NONE: + "betterend:amaranita_hyphae", + "betterend:amaranita_stem", + "betterend:ancient_emerald_ice", + "betterend:cave_bush", + "betterend:cave_pumpkin", + "betterend:dense_emerald_ice", + "betterend:dense_snow", + "betterend:dragon_tree_bark", + "betterend:dragon_tree_barrel", + "betterend:dragon_tree_bookshelf", + "betterend:dragon_tree_button", + "betterend:dragon_tree_chest", + "betterend:dragon_tree_composter", + "betterend:dragon_tree_crafting_table", + "betterend:dragon_tree_door", + "betterend:dragon_tree_fence", + "betterend:dragon_tree_gate", + "betterend:dragon_tree_ladder", + "betterend:dragon_tree_log", + "betterend:dragon_tree_planks", + "betterend:dragon_tree_plate", + "betterend:dragon_tree_sign", + "betterend:dragon_tree_slab", + "betterend:dragon_tree_stairs", + "betterend:dragon_tree_stripped_bark", + "betterend:dragon_tree_stripped_log", + "betterend:dragon_tree_trapdoor", + "betterend:emerald_ice", + "betterend:end_lotus_bark", + "betterend:end_lotus_barrel", + "betterend:end_lotus_bookshelf", + "betterend:end_lotus_button", + "betterend:end_lotus_chest", + "betterend:end_lotus_composter", + "betterend:end_lotus_crafting_table", + "betterend:end_lotus_door", + "betterend:end_lotus_fence", + "betterend:end_lotus_gate", + "betterend:end_lotus_ladder", + "betterend:end_lotus_log", + "betterend:end_lotus_planks", + "betterend:end_lotus_plate", + "betterend:end_lotus_sign", + "betterend:end_lotus_slab", + "betterend:end_lotus_stairs", + "betterend:end_lotus_stem", + "betterend:end_lotus_stripped_bark", + "betterend:end_lotus_stripped_log", + "betterend:end_lotus_trapdoor", + "betterend:helix_tree_bark", + "betterend:helix_tree_barrel", + "betterend:helix_tree_bookshelf", + "betterend:helix_tree_button", + "betterend:helix_tree_chest", + "betterend:helix_tree_composter", + "betterend:helix_tree_crafting_table", + "betterend:helix_tree_door", + "betterend:helix_tree_fence", + "betterend:helix_tree_gate", + "betterend:helix_tree_ladder", + "betterend:helix_tree_log", + "betterend:helix_tree_planks", + "betterend:helix_tree_plate", + "betterend:helix_tree_sign", + "betterend:helix_tree_slab", + "betterend:helix_tree_stairs", + "betterend:helix_tree_stripped_bark", + "betterend:helix_tree_stripped_log", + "betterend:helix_tree_trapdoor", + "betterend:jellyshroom_bark", + "betterend:jellyshroom_barrel", + "betterend:jellyshroom_bookshelf", + "betterend:jellyshroom_button", + "betterend:jellyshroom_cap_purple", + "betterend:jellyshroom_chest", + "betterend:jellyshroom_composter", + "betterend:jellyshroom_crafting_table", + "betterend:jellyshroom_door", + "betterend:jellyshroom_fence", + "betterend:jellyshroom_gate", + "betterend:jellyshroom_ladder", + "betterend:jellyshroom_log", + "betterend:jellyshroom_planks", + "betterend:jellyshroom_plate", + "betterend:jellyshroom_sign", + "betterend:jellyshroom_slab", + "betterend:jellyshroom_stairs", + "betterend:jellyshroom_stripped_bark", + "betterend:jellyshroom_stripped_log", + "betterend:jellyshroom_trapdoor", + "betterend:lacugrove_bark", + "betterend:lacugrove_barrel", + "betterend:lacugrove_bookshelf", + "betterend:lacugrove_button", + "betterend:lacugrove_chest", + "betterend:lacugrove_composter", + "betterend:lacugrove_crafting_table", + "betterend:lacugrove_door", + "betterend:lacugrove_fence", + "betterend:lacugrove_gate", + "betterend:lacugrove_ladder", + "betterend:lacugrove_log", + "betterend:lacugrove_planks", + "betterend:lacugrove_plate", + "betterend:lacugrove_sign", + "betterend:lacugrove_slab", + "betterend:lacugrove_stairs", + "betterend:lacugrove_stripped_bark", + "betterend:lacugrove_stripped_log", + "betterend:lacugrove_trapdoor", + "betterend:lucernia_bark", + "betterend:lucernia_barrel", + "betterend:lucernia_bookshelf", + "betterend:lucernia_button", + "betterend:lucernia_chest", + "betterend:lucernia_composter", + "betterend:lucernia_crafting_table", + "betterend:lucernia_door", + "betterend:lucernia_fence", + "betterend:lucernia_gate", + "betterend:lucernia_ladder", + "betterend:lucernia_log", + "betterend:lucernia_planks", + "betterend:lucernia_plate", + "betterend:lucernia_sign", + "betterend:lucernia_slab", + "betterend:lucernia_stairs", + "betterend:lucernia_stripped_bark", + "betterend:lucernia_stripped_log", + "betterend:lucernia_trapdoor", + "betterend:menger_sponge", + "betterend:menger_sponge_wet", + "betterend:mossy_glowshroom_bark", + "betterend:mossy_glowshroom_barrel", + "betterend:mossy_glowshroom_bookshelf", + "betterend:mossy_glowshroom_button", + "betterend:mossy_glowshroom_chest", + "betterend:mossy_glowshroom_composter", + "betterend:mossy_glowshroom_crafting_table", + "betterend:mossy_glowshroom_door", + "betterend:mossy_glowshroom_fence", + "betterend:mossy_glowshroom_gate", + "betterend:mossy_glowshroom_ladder", + "betterend:mossy_glowshroom_log", + "betterend:mossy_glowshroom_planks", + "betterend:mossy_glowshroom_plate", + "betterend:mossy_glowshroom_sign", + "betterend:mossy_glowshroom_slab", + "betterend:mossy_glowshroom_stairs", + "betterend:mossy_glowshroom_stripped_bark", + "betterend:mossy_glowshroom_stripped_log", + "betterend:mossy_glowshroom_trapdoor", + "betterend:neon_cactus", + "betterend:neon_cactus_block", + "betterend:neon_cactus_slab", + "betterend:neon_cactus_stairs", + "betterend:pythadendron_bark", + "betterend:pythadendron_barrel", + "betterend:pythadendron_bookshelf", + "betterend:pythadendron_button", + "betterend:pythadendron_chest", + "betterend:pythadendron_composter", + "betterend:pythadendron_crafting_table", + "betterend:pythadendron_door", + "betterend:pythadendron_fence", + "betterend:pythadendron_gate", + "betterend:pythadendron_ladder", + "betterend:pythadendron_log", + "betterend:pythadendron_planks", + "betterend:pythadendron_plate", + "betterend:pythadendron_sign", + "betterend:pythadendron_slab", + "betterend:pythadendron_stairs", + "betterend:pythadendron_stripped_bark", + "betterend:pythadendron_stripped_log", + "betterend:pythadendron_trapdoor", + "betterend:silk_moth_nest", + "betterend:tenanea_bark", + "betterend:tenanea_barrel", + "betterend:tenanea_bookshelf", + "betterend:tenanea_button", + "betterend:tenanea_chest", + "betterend:tenanea_composter", + "betterend:tenanea_crafting_table", + "betterend:tenanea_door", + "betterend:tenanea_fence", + "betterend:tenanea_gate", + "betterend:tenanea_ladder", + "betterend:tenanea_log", + "betterend:tenanea_planks", + "betterend:tenanea_plate", + "betterend:tenanea_sign", + "betterend:tenanea_slab", + "betterend:tenanea_stairs", + "betterend:tenanea_stripped_bark", + "betterend:tenanea_stripped_log", + "betterend:tenanea_trapdoor", + "betterend:umbrella_tree_bark", + "betterend:umbrella_tree_barrel", + "betterend:umbrella_tree_bookshelf", + "betterend:umbrella_tree_button", + "betterend:umbrella_tree_chest", + "betterend:umbrella_tree_cluster", + "betterend:umbrella_tree_cluster_empty", + "betterend:umbrella_tree_composter", + "betterend:umbrella_tree_crafting_table", + "betterend:umbrella_tree_door", + "betterend:umbrella_tree_fence", + "betterend:umbrella_tree_gate", + "betterend:umbrella_tree_ladder", + "betterend:umbrella_tree_log", + "betterend:umbrella_tree_membrane", + "betterend:umbrella_tree_planks", + "betterend:umbrella_tree_plate", + "betterend:umbrella_tree_sign", + "betterend:umbrella_tree_slab", + "betterend:umbrella_tree_stairs", + "betterend:umbrella_tree_stripped_bark", + "betterend:umbrella_tree_stripped_log", + "betterend:umbrella_tree_trapdoor", + +PICKAXES: + "betterend:aeternium_anvil", + "betterend:aeternium_block", + "betterend:amber_block", + "betterend:amber_moss", + "betterend:amber_moss_path", + "betterend:andesite_lantern", + "betterend:andesite_pedestal", + "betterend:aurora_crystal", + "betterend:azure_jadestone", + "betterend:azure_jadestone_bricks", + "betterend:azure_jadestone_bricks_slab", + "betterend:azure_jadestone_bricks_stairs", + "betterend:azure_jadestone_bricks_wall", + "betterend:azure_jadestone_button", + "betterend:azure_jadestone_furnace", + "betterend:azure_jadestone_lantern", + "betterend:azure_jadestone_pedestal", + "betterend:azure_jadestone_pillar", + "betterend:azure_jadestone_plate", + "betterend:azure_jadestone_polished", + "betterend:azure_jadestone_slab", + "betterend:azure_jadestone_stairs", + "betterend:azure_jadestone_tiles", + "betterend:azure_jadestone_wall", + "betterend:blackstone_lantern", + "betterend:brimstone", + "betterend:cave_moss", + "betterend:cave_moss_path", + "betterend:charcoal_block", + "betterend:chorus_nylium", + "betterend:chorus_nylium_path", + "betterend:crystal_moss", + "betterend:crystal_moss_path", + "betterend:diorite_lantern", + "betterend:diorite_pedestal", + "betterend:dragon_bone_block", + "betterend:dragon_bone_slab", + "betterend:dragon_bone_stairs", + "betterend:end_moss", + "betterend:end_moss_path", + "betterend:end_mycelium", + "betterend:end_mycelium_path", + "betterend:end_stone_furnace", + "betterend:end_stone_lantern", + "betterend:end_stone_smelter", + "betterend:ender_block", + "betterend:eternal_pedestal", + "betterend:flavolite", + "betterend:flavolite_bricks", + "betterend:flavolite_bricks_slab", + "betterend:flavolite_bricks_stairs", + "betterend:flavolite_bricks_wall", + "betterend:flavolite_button", + "betterend:flavolite_furnace", + "betterend:flavolite_lantern", + "betterend:flavolite_pedestal", + "betterend:flavolite_pillar", + "betterend:flavolite_plate", + "betterend:flavolite_polished", + "betterend:flavolite_runed", + "betterend:flavolite_runed_eternal", + "betterend:flavolite_slab", + "betterend:flavolite_stairs", + "betterend:flavolite_tiles", + "betterend:flavolite_wall", + "betterend:gold_chandelier", + "betterend:granite_lantern", + "betterend:granite_pedestal", + "betterend:hydrothermal_vent", + "betterend:infusion_pedestal", + "betterend:iron_bulb_lantern", + "betterend:iron_bulb_lantern_black", + "betterend:iron_bulb_lantern_blue", + "betterend:iron_bulb_lantern_brown", + "betterend:iron_bulb_lantern_cyan", + "betterend:iron_bulb_lantern_gray", + "betterend:iron_bulb_lantern_green", + "betterend:iron_bulb_lantern_light_blue", + "betterend:iron_bulb_lantern_light_gray", + "betterend:iron_bulb_lantern_lime", + "betterend:iron_bulb_lantern_magenta", + "betterend:iron_bulb_lantern_orange", + "betterend:iron_bulb_lantern_pink", + "betterend:iron_bulb_lantern_purple", + "betterend:iron_bulb_lantern_red", + "betterend:iron_bulb_lantern_white", + "betterend:iron_bulb_lantern_yellow", + "betterend:iron_chandelier", + "betterend:jungle_moss", + "betterend:jungle_moss_path", + "betterend:missing_tile", + "betterend:mossy_dragon_bone", + "betterend:mossy_obsidian", + "betterend:pink_moss", + "betterend:pink_moss_path", + "betterend:purpur_lantern", + "betterend:purpur_pedestal", + "betterend:quartz_lantern", + "betterend:quartz_pedestal", + "betterend:respawn_obelisk", + "betterend:rutiscus", + "betterend:rutiscus_path", + "betterend:sandy_jadestone", + "betterend:sandy_jadestone_bricks", + "betterend:sandy_jadestone_bricks_slab", + "betterend:sandy_jadestone_bricks_stairs", + "betterend:sandy_jadestone_bricks_wall", + "betterend:sandy_jadestone_button", + "betterend:sandy_jadestone_furnace", + "betterend:sandy_jadestone_lantern", + "betterend:sandy_jadestone_pedestal", + "betterend:sandy_jadestone_pillar", + "betterend:sandy_jadestone_plate", + "betterend:sandy_jadestone_polished", + "betterend:sandy_jadestone_slab", + "betterend:sandy_jadestone_stairs", + "betterend:sandy_jadestone_tiles", + "betterend:sandy_jadestone_wall", + "betterend:sangnum", + "betterend:sangnum_path", + "betterend:shadow_grass", + "betterend:shadow_grass_path", + "betterend:smaragdant_crystal", + "betterend:smaragdant_crystal_bricks", + "betterend:smaragdant_crystal_bricks_slab", + "betterend:smaragdant_crystal_bricks_stairs", + "betterend:smaragdant_crystal_bricks_wall", + "betterend:smaragdant_crystal_pedestal", + "betterend:smaragdant_crystal_pillar", + "betterend:smaragdant_crystal_polished", + "betterend:smaragdant_crystal_shard", + "betterend:smaragdant_crystal_slab", + "betterend:smaragdant_crystal_stairs", + "betterend:smaragdant_crystal_tiles", + "betterend:smaragdant_crystal_wall", + "betterend:sulphur_crystal", + "betterend:sulphuric_rock", + "betterend:sulphuric_rock_bricks", + "betterend:sulphuric_rock_bricks_slab", + "betterend:sulphuric_rock_bricks_stairs", + "betterend:sulphuric_rock_bricks_wall", + "betterend:sulphuric_rock_button", + "betterend:sulphuric_rock_furnace", + "betterend:sulphuric_rock_lantern", + "betterend:sulphuric_rock_pedestal", + "betterend:sulphuric_rock_pillar", + "betterend:sulphuric_rock_plate", + "betterend:sulphuric_rock_polished", + "betterend:sulphuric_rock_slab", + "betterend:sulphuric_rock_stairs", + "betterend:sulphuric_rock_tiles", + "betterend:sulphuric_rock_wall", + "betterend:terminite_anvil", + "betterend:terminite_bars", + "betterend:terminite_block", + "betterend:terminite_bulb_lantern", + "betterend:terminite_bulb_lantern_black", + "betterend:terminite_bulb_lantern_blue", + "betterend:terminite_bulb_lantern_brown", + "betterend:terminite_bulb_lantern_cyan", + "betterend:terminite_bulb_lantern_gray", + "betterend:terminite_bulb_lantern_green", + "betterend:terminite_bulb_lantern_light_blue", + "betterend:terminite_bulb_lantern_light_gray", + "betterend:terminite_bulb_lantern_lime", + "betterend:terminite_bulb_lantern_magenta", + "betterend:terminite_bulb_lantern_orange", + "betterend:terminite_bulb_lantern_pink", + "betterend:terminite_bulb_lantern_purple", + "betterend:terminite_bulb_lantern_red", + "betterend:terminite_bulb_lantern_white", + "betterend:terminite_bulb_lantern_yellow", + "betterend:terminite_chain", + "betterend:terminite_chandelier", + "betterend:terminite_door", + "betterend:terminite_plate", + "betterend:terminite_slab", + "betterend:terminite_stairs", + "betterend:terminite_tile", + "betterend:terminite_trapdoor", + "betterend:thallasium_anvil", + "betterend:thallasium_bars", + "betterend:thallasium_block", + "betterend:thallasium_bulb_lantern", + "betterend:thallasium_bulb_lantern_black", + "betterend:thallasium_bulb_lantern_blue", + "betterend:thallasium_bulb_lantern_brown", + "betterend:thallasium_bulb_lantern_cyan", + "betterend:thallasium_bulb_lantern_gray", + "betterend:thallasium_bulb_lantern_green", + "betterend:thallasium_bulb_lantern_light_blue", + "betterend:thallasium_bulb_lantern_light_gray", + "betterend:thallasium_bulb_lantern_lime", + "betterend:thallasium_bulb_lantern_magenta", + "betterend:thallasium_bulb_lantern_orange", + "betterend:thallasium_bulb_lantern_pink", + "betterend:thallasium_bulb_lantern_purple", + "betterend:thallasium_bulb_lantern_red", + "betterend:thallasium_bulb_lantern_white", + "betterend:thallasium_bulb_lantern_yellow", + "betterend:thallasium_chain", + "betterend:thallasium_chandelier", + "betterend:thallasium_door", + "betterend:thallasium_ore", + "betterend:thallasium_plate", + "betterend:thallasium_slab", + "betterend:thallasium_stairs", + "betterend:thallasium_tile", + "betterend:thallasium_trapdoor", + "betterend:violecite", + "betterend:violecite_bricks", + "betterend:violecite_bricks_slab", + "betterend:violecite_bricks_stairs", + "betterend:violecite_bricks_wall", + "betterend:violecite_button", + "betterend:violecite_furnace", + "betterend:violecite_lantern", + "betterend:violecite_pedestal", + "betterend:violecite_pillar", + "betterend:violecite_plate", + "betterend:violecite_polished", + "betterend:violecite_slab", + "betterend:violecite_stairs", + "betterend:violecite_tiles", + "betterend:violecite_wall", + "betterend:virid_jadestone", + "betterend:virid_jadestone_bricks", + "betterend:virid_jadestone_bricks_slab", + "betterend:virid_jadestone_bricks_stairs", + "betterend:virid_jadestone_bricks_wall", + "betterend:virid_jadestone_button", + "betterend:virid_jadestone_furnace", + "betterend:virid_jadestone_lantern", + "betterend:virid_jadestone_pedestal", + "betterend:virid_jadestone_pillar", + "betterend:virid_jadestone_plate", + "betterend:virid_jadestone_polished", + "betterend:virid_jadestone_slab", + "betterend:virid_jadestone_stairs", + "betterend:virid_jadestone_tiles", + "betterend:virid_jadestone_wall", \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java index d3e11b1a..61174938 100644 --- a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.ArmorStandArmorModel; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.world.entity.decoration.ArmorStand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.ArmorStandArmorModel; -import net.minecraft.client.renderer.entity.ArmorStandRenderer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.world.entity.decoration.ArmorStand; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(ArmorStandRenderer.class) public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { - public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) { + super(context, entityModel, f); } @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 6acaf8e9..8e7b7e23 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.client; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen; @Mixin(ClientPacketListener.class) public class ClientPlayNetworkHandlerMixin { + @Final @Shadow private Minecraft minecraft; diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java deleted file mode 100644 index 484b3a65..00000000 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.google.gson.Gson; - -import net.minecraft.client.renderer.block.model.BlockModelDefinition; - -@Mixin(BlockModelDefinition.Context.class) -public interface ContextGsonAccessor { - @Accessor - Gson getGson(); -} diff --git a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java index cc034cd5..f922d7b7 100644 --- a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.world.entity.Mob; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.HumanoidMobRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.world.entity.Mob; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(HumanoidMobRenderer.class) public abstract class HumanoidMobRendererMixin> extends MobRenderer { - public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) { + super(context, entityModel, f); } - @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java index d435dd52..8c92033c 100644 --- a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.player.PlayerRenderer; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(PlayerRenderer.class) public abstract class PlayerRendererMixin extends LivingEntityRenderer> { - public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public PlayerRendererMixin(EntityRendererProvider.Context context, PlayerModel entityModel, float f) { + super(context, entityModel, f); } - @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + @Inject(method = "*", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, boolean bl, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index b24d3517..b419cbab 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -2,6 +2,9 @@ package ru.betterend.mixin.client; import java.util.Random; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -92,7 +95,7 @@ public class WorldRendererMixin { } @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { + private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) { if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; @@ -108,9 +111,11 @@ public class WorldRendererMixin { RenderSystem.depthMask(false); } else { - RenderSystem.enableAlphaTest(); - RenderSystem.alphaFunc(516, 0.0F); + //TODO: Removed in 1.17 + //RenderSystem.enableAlphaTest(); + //RenderSystem.alphaFunc(516, 0.0F); RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); } float blindA = 1F - BackgroundInfo.blindness; @@ -120,40 +125,40 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.pushPose(); matrices.mulPose(new Quaternion(0, time, 0, false)); - textureManager.bind(HORIZON); - be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + RenderSystem.setShaderTexture(0, HORIZON); + be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, -time, 0, false)); - textureManager.bind(NEBULA_1); - be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + RenderSystem.setShaderTexture(0, NEBULA_1); + be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, time2, 0, false)); - textureManager.bind(NEBULA_2); - be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + RenderSystem.setShaderTexture(0, NEBULA_2); + be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); - - textureManager.bind(STARS); + + RenderSystem.setShaderTexture(0, STARS); matrices.pushPose(); matrices.mulPose(axis3.rotation(time)); - be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + be_renderBuffer(matrices, matrix4f ,stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); matrices.popPose(); matrices.pushPose(); matrices.mulPose(axis4.rotation(time2)); - be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); matrices.popPose(); } float a = (BackgroundInfo.fogDensity - 1F); if (a > 0) { if (a > 1) a = 1; - textureManager.bind(FOG); - be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); + RenderSystem.setShaderTexture(0, FOG); + be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); } RenderSystem.disableTexture(); @@ -161,27 +166,30 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.pushPose(); matrices.mulPose(axis1.rotation(time3)); - be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); matrices.popPose(); matrices.pushPose(); matrices.mulPose(axis2.rotation(time2)); - be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.popPose(); } RenderSystem.enableTexture(); RenderSystem.depthMask(true); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableBlend(); info.cancel(); } } - private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { - RenderSystem.color4f(r, g, b, a); + private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + RenderSystem.setShaderColor(r, g, b, a); buffer.bind(); - format.setupBufferState(0L); - buffer.draw(matrices.last().pose(), 7); + format.setupBufferState(); + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); + VertexBuffer.unbind(); format.clearBufferState(); } @@ -203,7 +211,10 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + //TODO: Test if this is working correct + //Format is set in the DrawState + //buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + buffer = new VertexBuffer(); be_makeStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -216,7 +227,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -229,7 +241,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -242,7 +255,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeCylinder(bufferBuilder, 16, 50, 100); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -255,7 +269,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeCylinder(bufferBuilder, 16, 50, 70); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -265,7 +280,7 @@ public class WorldRendererMixin { private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -308,7 +323,7 @@ public class WorldRendererMixin { private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -356,7 +371,7 @@ public class WorldRendererMixin { private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -406,7 +421,7 @@ public class WorldRendererMixin { } private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 41683dec..92615cdf 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -65,14 +65,14 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc } @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) - protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { + protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfo info) { if (be_currentRecipe != null) { inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); stack = be_currentRecipe.craft(inputSlots, player); slotsChanged(inputSlots); access.execute((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextDouble() < 0.1) { + if (!player.getAbilities().instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextDouble() < 0.1) { BlockState landingState = EndAnvilBlock.applyDamage(anvilState); if (landingState == null) { world.removeBlock(blockPos, false); @@ -85,7 +85,8 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc world.levelEvent(1030, blockPos, 0); } }); - info.setReturnValue(stack); + //TODO: no more return, does this still work? + //info.setReturnValue(stack); } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 43427483..eaa91743 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -46,7 +46,7 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + @Inject(method = "getStateForPlacement(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;", at = @At("RETURN"), cancellable = true) private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { BlockPos pos = ctx.getClickedPos(); Level world = ctx.getLevel(); diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 044538ce..61974050 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -1,31 +1,33 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChorusFlowerBlock; import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featureConfig, CallbackInfoReturnable info) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel structureWorldAccess = featureConfig.level(); if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java index 4ff99959..2a10659e 100644 --- a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -27,11 +27,7 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { @Final @Shadow - public static int HORIZONTAL_MASK; - - @Final - @Shadow - public static int VERTICAL_MASK; + private static int HORIZONTAL_MASK; @Override public void be_setBiome(Biome biome, BlockPos pos) { @@ -78,9 +74,12 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { biomes[index] = biome; } + @Shadow @Final private int quartMinY; + @Shadow @Final private int quartHeight; + private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { int i = biomeX & HORIZONTAL_MASK; - int j = Mth.clamp(biomeY, 0, VERTICAL_MASK); + int j = Mth.clamp(biomeY - this.quartMinY, 0, this.quartHeight); int k = biomeZ & HORIZONTAL_MASK; return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; } diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index e91f8949..5a054c59 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.LevelHeightAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,15 +19,15 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) - private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, LevelHeightAccessor levelHeightAccessor, CallbackInfoReturnable info) { if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); if (chance == 0) { - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } else if (chunkRandom.nextInt(chance) == 0){ - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } else { @@ -37,7 +38,7 @@ public class EndCityFeatureMixin { } @Shadow - private static int getYPositionForFeature(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + private static int getYPositionForFeature(ChunkPos pos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { return 0; } } diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 20c73a27..a10f460b 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -1,7 +1,16 @@ package ru.betterend.mixin.common; -import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,22 +18,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(EndPodiumFeature.class) public class EndPodiumFeatureMixin { @Final @@ -32,25 +32,29 @@ public class EndPodiumFeatureMixin { private boolean active; @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); } else if (GeneratorOptions.replacePortal()) { - blockPos = be_updatePos(blockPos, world); + Random random = featurePlaceContext.random(); + WorldGenLevel world = featurePlaceContext.level(); + BlockPos blockPos = be_updatePos(featurePlaceContext.origin(), world); StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(active ? "portal/end_portal_active" : "portal/end_portal_inactive")); - BlockPos size = structure.getSize(); + Vec3i size = structure.getSize(); blockPos = blockPos.offset(-(size.getX() >> 1), -1, -(size.getZ() >> 1)); - structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); + structure.placeInWorld(world, blockPos, blockPos, new StructurePlaceSettings(), random, 2); info.setReturnValue(true); info.cancel(); } } @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) - private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { - return be_updatePos(blockPos, world); + private FeaturePlaceContext be_setPosOnGround(FeaturePlaceContext featurePlaceContext) { + WorldGenLevel world = featurePlaceContext.level(); + BlockPos pos = be_updatePos(featurePlaceContext.origin(), world); + return new FeaturePlaceContext(world, featurePlaceContext.chunkGenerator(), featurePlaceContext.random(), pos, featurePlaceContext.config()); } private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 4f9372b8..52a4f80a 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -19,11 +19,10 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { @Shadow - public float yRot; + private float yRot; @Shadow - public float xRot; - @Shadow - public boolean removed; + private float xRot; + @Shadow public Level level; @@ -40,11 +39,16 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); + @Shadow + protected abstract void removeAfterChangingDimensions(); + + @Shadow public abstract boolean isRemoved(); + private BlockPos exitPos; @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (!removed && be_canTeleport() && level instanceof ServerLevel) { + if (!isRemoved() && be_canTeleport() && level instanceof ServerLevel) { unRide(); level.getProfiler().push("changeDimension"); level.getProfiler().push("reposition"); @@ -54,11 +58,14 @@ public abstract class EntityMixin implements TeleportingEntity { Entity entity = getType().create(destination); if (entity != null) { entity.restoreFrom(Entity.class.cast(this)); - entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); + entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.getXRot()); entity.setDeltaMovement(teleportTarget.speed); - destination.addFromAnotherDimension(entity); + //TODO: check if this works as intended in 1.17 + + destination.addDuringTeleport(entity); } - removed = true; + + this.removeAfterChangingDimensions(); level.getProfiler().pop(); ((ServerLevel) level).resetEmptyTime(); destination.resetEmptyTime(); diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index b4e430d6..bbf7db3f 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -32,6 +32,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import ru.betterend.BetterEnd; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.item.CrystaliteArmor; @@ -89,8 +90,12 @@ public abstract class LivingEntityMixin extends Entity { @Inject(method = "canBeAffected", at = @At("HEAD"), cancellable = true) public void be_canBeAffected(MobEffectInstance mobEffectInstance, CallbackInfoReturnable info) { - if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { - info.setReturnValue(false); + try { + if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { + info.setReturnValue(false); + } + } catch (Exception ex) { + BetterEnd.LOGGER.warning("Blindness resistance attribute haven't been registered."); } } @@ -99,8 +104,8 @@ public abstract class LivingEntityMixin extends Entity { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) - private float be_increaseKnockback(float value, double x, double z) { + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index=0) + private double be_increaseKnockback(double value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; value += this.be_getKnockback(attacker.getMainHandItem().getItem()); @@ -144,9 +149,9 @@ public abstract class LivingEntityMixin extends Entity { Vec3 lookAngle = getLookAngle(); double d = 0.08D; - float rotX = xRot * 0.017453292F; + float rotX = getXRot() * 0.017453292F; double k = Math.sqrt(lookAngle.x * lookAngle.x + lookAngle.z * lookAngle.z); - double l = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double l = moveDelta.horizontalDistance(); double lookLen = lookAngle.length(); float n = Mth.cos(rotX); n = (float) (n * n * Math.min(1.0D, lookLen / 0.4D)); @@ -172,7 +177,7 @@ public abstract class LivingEntityMixin extends Entity { move(MoverType.SELF, moveDelta); if (!level.isClientSide) { if (horizontalCollision) { - coef = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + coef = moveDelta.horizontalDistance(); double r = l - coef; float dmg = (float) (r * 10.0D - 3.0D); if (dmg > 0.0F) { diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 1c3d5f0a..e6cf8cfd 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.WorldData; import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin { +public abstract class MinecraftServerMixin { @Shadow private ServerResources resources; @@ -35,7 +35,7 @@ public class MinecraftServerMixin { protected WorldData worldData; @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) - private final void be_overworld(CallbackInfoReturnable info) { + private void be_overworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { ServerLevel world = levels.get(Level.END); if (world == null) { @@ -47,7 +47,7 @@ public class MinecraftServerMixin { } @Inject(method = "createLevels", at = @At(value = "TAIL")) - private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { + private void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { ServerLevel world = levels.get(Level.END); if (world == null) { @@ -57,20 +57,20 @@ public class MinecraftServerMixin { ServerLevelData serverWorldProperties = worldData.overworldData(); net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings(); boolean bl = generatorOptions.isDebug(); - setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); + setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl); } } - + + @Shadow private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {}; + @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { info.cancel(); } } - @Shadow - private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} - + @Shadow public PlayerList getPlayerList() { return null; diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java index 8d59913e..c39fa3e3 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -32,8 +32,8 @@ public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { TerrainGenerator.initNoise(seed); } - @Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) - private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { + @Inject(method = "fillNoiseColumn([DIIII)V", at = @At("HEAD"), cancellable = true, allow = 2) + private void be_fillNoiseColumn(double[] buffer, int x, int z, int k, int l, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java index 408fb3fa..b855259b 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -3,21 +3,13 @@ package ru.betterend.mixin.common; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.UUID; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.mojang.authlib.GameProfile; import com.mojang.serialization.DataResult; import com.mojang.serialization.Dynamic; - import io.netty.buffer.Unpooled; import net.minecraft.ChatFormatting; import net.minecraft.Util; @@ -56,6 +48,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelData; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.world.generator.GeneratorOptions; @Mixin(PlayerList.class) @@ -84,141 +83,150 @@ public class PlayerListMixin { private Map playersByUUID; @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) - public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { + public void be_placeNewPlayer(Connection connection, ServerPlayer serverPlayer, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { - GameProfile gameProfile = player.getGameProfile(); + GameProfile gameProfile = serverPlayer.getGameProfile(); GameProfileCache userCache = this.server.getProfileCache(); - GameProfile gameProfile2 = userCache.get(gameProfile.getId()); - String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); + Optional gameProfile2 = userCache.get(gameProfile.getId()); + String string = gameProfile2.isPresent() ? gameProfile2.get().getName() : gameProfile.getName(); userCache.add(gameProfile); - CompoundTag compoundTag = this.load(player); + CompoundTag compoundTag = this.load(serverPlayer); ResourceKey var23; if (compoundTag != null) { DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); Logger var10001 = LOGGER; - var10001.getClass(); + Objects.requireNonNull(var10001); var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); - } - else { + } else { var23 = Level.END; } ResourceKey registryKey = var23; - ServerLevel serverWorld = this.server.getLevel(registryKey); - ServerLevel serverWorld3; - if (serverWorld == null) { + ServerLevel serverLevel = this.server.getLevel(registryKey); + ServerLevel serverLevel3; + if (serverLevel == null) { LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); - serverWorld3 = this.server.overworld(); - } - else { - serverWorld3 = serverWorld; + serverLevel3 = this.server.overworld(); + } else { + serverLevel3 = serverLevel; } - player.setLevel(serverWorld3); - player.gameMode.setLevel((ServerLevel) player.level); + serverPlayer.setLevel(serverLevel3); + //serverPlayer.gameMode.setLevel((ServerLevel) serverPlayer.level); String string2 = "local"; if (connection.getRemoteAddress() != null) { string2 = connection.getRemoteAddress().toString(); } - LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); - LevelData worldProperties = serverWorld3.getLevelData(); - this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); - ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); - GameRules gameRules = serverWorld3.getGameRules(); + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", serverPlayer.getName().getString(), string2, + serverPlayer.getId(), serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ()); + LevelData worldProperties = serverLevel3.getLevelData(); + serverPlayer.loadGameTypes(compoundTag); + //this.updatePlayerGameMode(serverPlayer, (ServerPlayer) null, serverLevel3); + ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, + connection, serverPlayer); + GameRules gameRules = serverLevel3.getGameRules(); boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); - serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), - worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, - serverWorld3.isDebug(), serverWorld3.isFlat())); - serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); - serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); - serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); - serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); - serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); - this.sendPlayerPermissionLevel(player); - player.getStats().markAllDirty(); - player.getRecipeBook().sendInitialRecipeBook(player); - this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); + serverPlayNetworkHandler.send(new ClientboundLoginPacket(serverPlayer.getId(), + serverPlayer.gameMode.getGameModeForPlayer(), serverPlayer.gameMode.getPreviousGameModeForPlayer(), + BiomeManager.obfuscateSeed(serverLevel3.getSeed()), worldProperties.isHardcore(), + this.server.levelKeys(), this.registryHolder, serverLevel3.dimensionType(), serverLevel3.dimension(), + this.getMaxPlayers(), this.viewDistance, bl2, !bl, serverLevel3.isDebug(), serverLevel3.isFlat())); + serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, + (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); + serverPlayNetworkHandler + .send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(serverPlayer.getAbilities())); + serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(serverPlayer.getInventory().selected)); + serverPlayNetworkHandler + .send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); + serverPlayNetworkHandler + .send(new ClientboundUpdateTagsPacket(this.server.getTags().serializeToNetwork(this.registryHolder))); + this.sendPlayerPermissionLevel(serverPlayer); + serverPlayer.getStats().markAllDirty(); + serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer); + this.updateEntireScoreboard(serverLevel3.getScoreboard(), serverPlayer); this.server.invalidateStatus(); TranslatableComponent mutableText2; - if (player.getGameProfile().getName().equalsIgnoreCase(string)) { - mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); - } - else { - mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); + if (serverPlayer.getGameProfile().getName().equalsIgnoreCase(string)) { + mutableText2 = new TranslatableComponent("multiplayer.player.joined", + new Object[] { serverPlayer.getDisplayName() }); + } else { + mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", + new Object[] { serverPlayer.getDisplayName(), string }); } this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); - serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); - this.players.add(player); - this.playersByUUID.put(player.getUUID(), player); - this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); + serverPlayNetworkHandler.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), + serverPlayer.getYRot(), serverPlayer.getXRot()); + this.players.add(serverPlayer); + this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer); + this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, + new ServerPlayer[] { serverPlayer })); - for (int i = 0; i < this.players.size(); ++i) { - player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); + for (ServerPlayer player : this.players) { + serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, + new ServerPlayer[]{(ServerPlayer) player})); } - serverWorld3.addNewPlayer(player); - this.server.getCustomBossEvents().onPlayerConnect(player); - this.sendLevelInfo(player, serverWorld3); + serverLevel3.addNewPlayer(serverPlayer); + this.server.getCustomBossEvents().onPlayerConnect(serverPlayer); + this.sendLevelInfo(serverPlayer, serverLevel3); if (!this.server.getResourcePack().isEmpty()) { - player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); + serverPlayer.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash(), + this.server.isResourcePackRequired(), this.server.getResourcePackPrompt()); } - Iterator var24 = player.getActiveEffects().iterator(); - - while (var24.hasNext()) { - MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); - serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); + for (MobEffectInstance statusEffectInstance : serverPlayer.getActiveEffects()) { + serverPlayNetworkHandler + .send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance)); } if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); - Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { - return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; - }); + Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverLevel3, + (vehicle) -> { + return !serverLevel3.addWithUUID(vehicle) ? null : vehicle; + }); if (entity != null) { UUID uUID2; if (compoundTag2.hasUUID("Attach")) { uUID2 = compoundTag2.getUUID("Attach"); - } - else { + } else { uUID2 = null; } Iterator var21; Entity entity3; if (entity.getUUID().equals(uUID2)) { - player.startRiding(entity, true); - } - else { + serverPlayer.startRiding(entity, true); + } else { var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); if (entity3.getUUID().equals(uUID2)) { - player.startRiding(entity3, true); + serverPlayer.startRiding(entity3, true); break; } } } - if (!player.isPassenger()) { + if (!serverPlayer.isPassenger()) { LOGGER.warn("Couldn't reattach entity to player"); - serverWorld3.despawn(entity); + entity.discard(); var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); - serverWorld3.despawn(entity3); + entity3.discard(); } } } } - player.initMenu(); + serverPlayer.initInventoryMenu(); info.cancel(); } } @@ -228,8 +236,8 @@ public class PlayerListMixin { return null; } - @Shadow - private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} + // @Shadow + // private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} @Shadow public void sendPlayerPermissionLevel(ServerPlayer player) {} @@ -239,6 +247,9 @@ public class PlayerListMixin { return 0; } + @Shadow + public int getMaxPlayers() { return 0; } + @Shadow public MinecraftServer getServer() { return null; diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index 1f85de89..eb7a99d1 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -69,7 +69,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), getYRot(), getXRot())); } } @@ -85,21 +85,21 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerList playerManager = server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); - serverWorld.removePlayerImmediately(player); - removed = false; + serverWorld.removePlayerImmediately(player, RemovalReason.CHANGED_DIMENSION); + unsetRemoved(); PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { serverWorld.getProfiler().push("moving"); serverWorld.getProfiler().pop(); serverWorld.getProfiler().push("placing"); - setLevel(destination); + this.level = destination; destination.addDuringPortalTeleport(player); setRot(teleportTarget.yRot, teleportTarget.xRot); moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); triggerDimensionChangeTriggers(serverWorld); gameMode.setLevel(destination); - connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); + connection.send(new ClientboundPlayerAbilitiesPacket(getAbilities())); playerManager.sendLevelInfo(player, destination); playerManager.sendAllPlayerInfo(player); @@ -132,7 +132,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt } @Shadow - abstract ServerLevel getLevel(); + public abstract ServerLevel getLevel(); @Shadow abstract void triggerDimensionChangeTriggers(ServerLevel origin); diff --git a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java new file mode 100644 index 00000000..3f709fba --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import ru.betterend.util.ShuffelingListExtended; + +import java.util.List; + +@Mixin(ShufflingList.class) +public abstract class ShuffelingListMixin implements ShuffelingListExtended { + @Shadow @Final protected List> entries; + + public boolean isEmpty() { + return this.entries.isEmpty(); + } + + @Shadow public abstract ShufflingList shuffle(); + + public U getOne() { + return this.shuffle().stream().findFirst().orElseThrow(RuntimeException::new); + } +} diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 5d5ba94f..a6a9509c 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -1,5 +1,8 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,7 +10,11 @@ import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) -public class SlimeMixin implements ISlime { +public abstract class SlimeMixin extends Entity implements ISlime { + public SlimeMixin(EntityType entityType, Level level) { + super(entityType, level); + } + @Shadow protected void setSize(int size, boolean heal) {} @@ -15,4 +22,9 @@ public class SlimeMixin implements ISlime { public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } + + @Override + public void entityRemove(Entity.RemovalReason removalReason){ + super.remove(removalReason); + } } diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 58b3001e..3a4c5e48 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -1,40 +1,39 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.IronBarsBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.SpikeFeature; import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(SpikeFeature.class) public class SpikeFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } @@ -70,7 +69,7 @@ public class SpikeFeatureMixin { radius--; StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); - BlockPos side = base.getSize(); + Vec3i 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(); @@ -78,8 +77,8 @@ public class SpikeFeatureMixin { maxY = pos2.getY(); StructurePlaceSettings data = new StructurePlaceSettings(); - base.placeInWorldChunk(world, pos1, data, random); - top.placeInWorldChunk(world, pos2, data, random); + base.placeInWorld(world, pos1, pos1, data, random, 2); + top.placeInWorld(world, pos2, pos2, data, random, 2); int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java index 3389bfbc..bf4b1680 100644 --- a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java +++ b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java @@ -16,7 +16,7 @@ package ru.betterend.noise; * will be the same when ported to other languages. */ -public class OpenSimplexNoise { +public final class OpenSimplexNoise { private static final double STRETCH_CONSTANT_2D = -0.211324865405187; // (1/Math.sqrt(2+1)-1)/2; private static final double SQUISH_CONSTANT_2D = 0.366025403784439; // (Math.sqrt(2+1)-1)/2; private static final double STRETCH_CONSTANT_3D = -1.0 / 6; // (1/Math.sqrt(3+1)-1)/3; diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 672f3ab9..bda8fe13 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -17,11 +17,10 @@ import ru.bclib.util.ColorUtil; import ru.betterend.registry.EndParticles; public class InfusionParticleType extends ParticleType implements ParticleOptions { - public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> { - return new InfusionParticleType(EndParticles.INFUSION, itemStack); - }, infusionParticleType -> { - return infusionParticleType.itemStack; - }); + public static final Codec CODEC = ItemStack.CODEC.xmap( + itemStack -> new InfusionParticleType(EndParticles.INFUSION, itemStack), + infusionParticleType -> infusionParticleType.itemStack); + public static final ParticleOptions.Deserializer PARAMETERS_FACTORY = new ParticleOptions.Deserializer() { public InfusionParticleType fromCommand(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { stringReader.expect(' '); @@ -35,8 +34,8 @@ public class InfusionParticleType extends ParticleType imp } }; - private ParticleType type; - private ItemStack itemStack; + private final ParticleType type; + private final ItemStack itemStack; public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 98e79b2c..0f962887 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -3,6 +3,7 @@ package ru.betterend.recipe.builders; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; @@ -32,7 +33,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "alloying"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); protected final RecipeType type; protected final ResourceLocation id; diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 2a9ed475..0bee9b39 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -4,9 +4,12 @@ import java.util.Objects; import com.google.gson.JsonObject; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; @@ -276,6 +279,15 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (output == null) { throw new IllegalStateException("Output item does not exists!"); } + if (result.has("nbt")) { + try { + String nbtData = GsonHelper.getAsString(result, "nbt"); + CompoundTag nbt = TagParser.parseTag(nbtData); + output.setTag(nbt); + } catch (CommandSyntaxException ex) { + BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); + } + } int inputCount = GsonHelper.getAsInt(json, "inputCount", 1); int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index b05b2f37..fb798265 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -4,9 +4,13 @@ import java.util.Arrays; import com.google.gson.JsonObject; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; @@ -29,7 +33,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "infusion"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); private final ResourceLocation id; private final Ingredient[] catalysts; @@ -209,6 +213,15 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { if (recipe.output == null) { throw new IllegalStateException("Output item does not exists!"); } + if (result.has("nbt")) { + try { + String nbtData = GsonHelper.getAsString(result, "nbt"); + CompoundTag nbt = TagParser.parseTag(nbtData); + recipe.output.setTag(nbt); + } catch (CommandSyntaxException ex) { + BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); + } + } recipe.group = GsonHelper.getAsString(json, "group", GROUP); recipe.time = GsonHelper.getAsInt(json, "time", 1); diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index b39fd679..7dd8ee5f 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -61,7 +61,6 @@ import ru.betterend.world.generator.BiomeType; import ru.betterend.world.generator.GeneratorOptions; public class EndBiomes { - private static final Map ID_MAP = Maps.newHashMap(); public static final Set FABRIC_VOID = Sets.newHashSet(); private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); @@ -161,7 +160,7 @@ public class EndBiomes { else { LAND_BIOMES.addBiomeMutable(endBiome); } - ID_MAP.put(id, endBiome); + BiomeAPI.registerBiome(endBiome); } } } @@ -274,7 +273,7 @@ public class EndBiomes { parent.addSubBiome(endBiome); SUBBIOMES.add(endBiome); SUBBIOMES_UNMUTABLES.add(endBiome.getID()); - ID_MAP.put(endBiome.getID(), endBiome); + BiomeAPI.registerBiome(endBiome); } return endBiome; } @@ -291,7 +290,6 @@ public class EndBiomes { parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -307,7 +305,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); addToPicker(biome, type); - ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { BiomeAPI.addEndLandBiomeToFabricApi(biome); } @@ -328,7 +325,6 @@ public class EndBiomes { BiomeAPI.registerBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -341,7 +337,7 @@ public class EndBiomes { */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - EndBiome parentBiome = ID_MAP.get(parent); + BCLBiome parentBiome = BiomeAPI.getBiome(parent); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { parentBiome.addSubBiome(biome); } @@ -369,7 +365,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); CAVE_BIOMES.addBiome(biome); - ID_MAP.put(biome.getID(), biome); } return biome; } @@ -377,8 +372,4 @@ public class EndBiomes { public static EndCaveBiome getCaveBiome(int x, int z) { return (EndCaveBiome) caveBiomeMap.getBiome(x, z); } - - public static boolean hasBiome(ResourceLocation biomeID) { - return ID_MAP.containsKey(biomeID); - } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 93535912..7157ebc0 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -1,5 +1,6 @@ package ru.betterend.registry; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.core.Registry; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -15,18 +16,20 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, - BlockEntityType.Builder.of(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); + FabricBlockEntityTypeBuilder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", - BlockEntityType.Builder.of(PedestalBlockEntity::new, getPedestals())); + FabricBlockEntityTypeBuilder.create(PedestalBlockEntity::new, getPedestals())); public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", - BlockEntityType.Builder.of(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); + FabricBlockEntityTypeBuilder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", - BlockEntityType.Builder.of(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); + FabricBlockEntityTypeBuilder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", - BlockEntityType.Builder.of(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + FabricBlockEntityTypeBuilder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); - public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { + public static BlockEntityType registerBlockEntity(String id, FabricBlockEntityTypeBuilder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); + + //return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 0dedbfac..35138b6c 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; import ru.bclib.util.ColorUtil; @@ -47,8 +48,8 @@ public class EndEntities { } return type; } - - private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + + private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { ResourceLocation id = BetterEnd.makeID(name); EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)).build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 30384554..c91df925 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -1,32 +1,70 @@ package ru.betterend.registry; -import java.util.function.Function; - +import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import ru.betterend.entity.render.RendererEntityCubozoa; -import ru.betterend.entity.render.RendererEntityDragonfly; -import ru.betterend.entity.render.RendererEntityEndFish; -import ru.betterend.entity.render.RendererEntityEndSlime; -import ru.betterend.entity.render.RendererEntityShadowWalker; -import ru.betterend.entity.render.SilkMothEntityRenderer; +import ru.betterend.BetterEnd; +import ru.betterend.entity.model.*; +import ru.betterend.entity.render.*; +import ru.betterend.item.model.*; public class EndEntitiesRenders { - + + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); + public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); + public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); + public static final ModelLayerLocation END_FISH_MODEL = registerMain("endfish"); + public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation SILK_MOTH_MODEL = registerMain("silkmoth"); + + //Not sure if this should go to another registry + public static final ModelLayerLocation ARMORED_ELYTRA = registerMain("armored_elytra"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE = registerMain("crystalite_chestplate"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE_THIN = registerMain("crystalite_chestplate_thin"); + public static final ModelLayerLocation CRYSTALITE_HELMET = registerMain("crystalite_helmet"); + public static final ModelLayerLocation CRYSTALITE_LEGGINGS = registerMain("crystalite_leggings"); + public static final ModelLayerLocation CRYSTALITE_BOOTS = registerMain("crystalite_boots"); + public static void register() { - register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); - register(EndEntities.END_SLIME, RendererEntityEndSlime::new); - register(EndEntities.END_FISH, RendererEntityEndFish::new); - register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); - register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); - register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); + register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); + register(EndEntities.END_SLIME, RendererEntityEndSlime.class); + register(EndEntities.END_FISH, RendererEntityEndFish.class); + register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker.class); + register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); + + EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, DragonflyEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_FISH_MODEL, EndFishEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(SILK_MOTH_MODEL, SilkMothEntityModel::getTexturedModelData); + + EntityModelLayerRegistry.registerModelLayer(ARMORED_ELYTRA, ArmoredElytraModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE, CrystaliteChestplateModel::getRegularTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE_THIN, CrystaliteChestplateModel::getThinTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_HELMET, CrystaliteHelmetModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_LEGGINGS, CrystaliteLeggingsModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_BOOTS, CrystaliteBootsModel::getTexturedModelData); } - - private static void register(EntityType type, Function> render) { - EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { - return render.apply(entityRenderDispatcher); + + private static void register(EntityType type, Class> renderer) { + EntityRendererRegistry.INSTANCE.register(type, (context) -> { + MobRenderer render = null; + try { + render = renderer.getConstructor(context.getClass()).newInstance(context); + } + catch (Exception e) { + e.printStackTrace(); + } + return render; }); } + + private static ModelLayerLocation registerMain(String id){ + return new ModelLayerLocation(new ResourceLocation(BetterEnd.MOD_ID, id), "main"); + } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 0983d21f..73168e37 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.levelgen.placement.FeatureDecorator; import ru.bclib.api.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; +import ru.bclib.world.features.BCLDecorators; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.features.DefaultFeature; import ru.betterend.BetterEnd; @@ -239,7 +240,9 @@ public class EndFeatures { public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); - + + + private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index f37b456a..e302d163 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -2,6 +2,7 @@ package ru.betterend.registry; import java.util.List; +import net.minecraft.world.entity.Mob; import org.jetbrains.annotations.NotNull; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; @@ -175,7 +176,7 @@ public class EndItems extends ItemsRegistry { return getItemRegistry().registerTool(name, item); } - public static Item registerEndEgg(String name, EntityType type, int background, int dots) { + public static Item registerEndEgg(String name, EntityType type, int background, int dots) { return getItemRegistry().registerEgg(name, type, background, dots); } diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index 80952641..0bcb41ce 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -2,8 +2,8 @@ package ru.betterend.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry; import ru.betterend.item.model.CrystaliteArmorProvider; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) public class EndModelProviders { diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 7ce95c65..bcae1aff 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,20 +1,14 @@ package ru.betterend.registry; import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Named; -import net.minecraft.tags.TagCollection; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.level.biome.Biome; @@ -39,43 +33,12 @@ public class EndTags { // https://fabricmc.net/wiki/tutorial:tags // Block Tags - public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); - public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); - public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); + public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); + public static final Tag.Named END_STONES = TagAPI.makeCommonBlockTag("end_stones"); + public static final Tag.Named DRAGON_IMMUNE = TagAPI.getMCBlockTag("dragon_immune"); // Item Tags - public final static Tag.Named HAMMERS = makeFabricItemTag("hammers"); - - public static Tag.Named makeTag(Supplier> containerSupplier, ResourceLocation id) { - Tag tag = containerSupplier.get().getTag(id); - return tag == null ? TagRegistry.create(id, containerSupplier) : (Named) tag; - } - - public static Tag.Named makeBlockTag(String name) { - return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeItemTag(String name) { - return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeCommonBlockTag(String name) { - return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeCommonItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeFabricItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("fabric", name)); - } - - public static Tag.Named getMCBlockTag(String name) { - ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; - } + public final static Tag.Named HAMMERS = TagAPI.makeItemTag("fabric", "hammers"); public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); @@ -104,6 +67,8 @@ public class EndTags { ComposterBlockAccessor.callAdd(0.1F, block); } }); + TagAPI.addEndGround(EndBlocks.CAVE_MOSS); + TagHelper.addTag(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS); List hammers = Lists.newArrayList(); diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 1d7ebbdc..60e126c4 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -293,7 +293,7 @@ public class EternalRitual { private BlockPos findPortalPos(int portalId) { MinecraftServer server = world.getServer(); ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); - Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); + Registry registry = Objects.requireNonNull(server).registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); BlockPos framePos = findFrame(targetWorld, basePos.mutable()); diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index f240ec47..005e6b38 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -11,7 +11,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index 9e9a0dcb..f0cdbc91 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -1,6 +1,7 @@ package ru.betterend.util; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -20,187 +21,194 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; public class BlockFixer { - private static final MutableBlockPos POS = new MutableBlockPos(); private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); - + public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { - BlockState state; - Set doubleCheck = Sets.newHashSet(); - for (int x = start.getX(); x <= end.getX(); x++) { - POS.setX(x); - for (int z = start.getZ(); z <= end.getZ(); z++) { - POS.setZ(z); - for (int y = start.getY(); y <= end.getY(); y++) { - POS.setY(y); - state = world.getBlockState(POS); - - if (state.getBlock() instanceof FurBlock) { - doubleCheck.add(POS.immutable()); - } - // Liquids - else if (!state.getFluidState().isEmpty()) { - if (!state.canSurvive(world, POS)) { - BlocksHelper.setWithoutUpdate(world, POS, WATER); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - while (!state.canSurvive(world, POS)) { - state = state.getFluidState().isEmpty() ? AIR : WATER; - BlocksHelper.setWithoutUpdate(world, POS, state); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - POS.setY(y - 1); - if (world.isEmptyBlock(POS)) { - POS.setY(y); - while (!world.getFluidState(POS).isEmpty()) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - } - continue; - } - for (Direction dir : BlocksHelper.HORIZONTAL) { - if (world.isEmptyBlock(POS.relative(dir))) { - world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); - break; - } - } - } - else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + Set doubleCheck = Sets.newConcurrentHashSet(); + int dx = end.getX() - start.getX() + 1; + int dz = end.getZ() - start.getZ() + 1; + int count = dx * dz; + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos POS = new MutableBlockPos(); + POS.setX((index % dx) + start.getX()); + POS.setZ((index / dx) + start.getZ()); + BlockState state; + for (int y = start.getY(); y <= end.getY(); y++) { + POS.setY(y); + state = world.getBlockState(POS); + + if (state.getBlock() instanceof FurBlock) { + doubleCheck.add(POS.immutable()); + } + // Liquids + else if (!state.getFluidState().isEmpty()) { + if (!state.canSurvive(world, POS)) { + setWithoutUpdate(world, POS, WATER); POS.setY(POS.getY() - 1); - if (world.isEmptyBlock(POS)) { + state = world.getBlockState(POS); + while (!state.canSurvive(world, POS)) { + state = state.getFluidState().isEmpty() ? AIR : WATER; + setWithoutUpdate(world, POS, state); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + } + } + POS.setY(y - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(y); + while (!world.getFluidState(POS).isEmpty()) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); - while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); + } + continue; + } + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (world.isEmptyBlock(POS.relative(dir))) { + world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); + break; + } + } + } + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(POS.getY() + 1); + while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canSurvive(world, POS)) { + if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); state = world.getBlockState(POS); } } - } - else if (state.getBlock() instanceof StalactiteBlock) { - if (!state.canSurvive(world, POS)) { - if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - else { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - } - } - else if (state.is(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - } - else if (!state.canSurvive(world, POS)) { - // Chorus - if (state.is(Blocks.CHORUS_PLANT)) { - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(POS.immutable()); - - for (int i = 0; i < 64 && !ends.isEmpty(); i++) { - ends.forEach((pos) -> { - BlocksHelper.setWithoutUpdate(world, pos, AIR); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos p = pos.relative(dir); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - } - BlockPos p = pos.above(); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - }); - ends.clear(); - ends.addAll(add); - add.clear(); - } - } - // Vines - else if (state.getBlock() instanceof BaseVineBlock) { - while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - } - } - // Falling blocks - else if (state.getBlock() instanceof FallingBlock) { - BlockState falling = state; - - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - - int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); - if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - if (world.getRandom().nextBoolean()) { - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - } - } - else { - POS.setY(y); - BlockState replacement = AIR; - for (Direction dir : BlocksHelper.HORIZONTAL) { - state = world.getBlockState(POS.relative(dir)); - if (!state.getFluidState().isEmpty()) { - replacement = state; - break; - } - } - BlocksHelper.setWithoutUpdate(world, POS, replacement); - POS.setY(y - ray); - BlocksHelper.setWithoutUpdate(world, POS, falling); - } - } - // Blocks without support else { - // Blue Vine - if (state.getBlock() instanceof BlueVineBlock) { - while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - // Double plants - if (state.getBlock() instanceof BaseDoublePlantBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - // Other blocks - else { - BlocksHelper.setWithoutUpdate(world, POS, getAirOrFluid(state)); + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); } } } } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(world, POS, AIR); + } + } + else if (!state.canSurvive(world, POS)) { + // Chorus + if (state.is(Blocks.CHORUS_PLANT)) { + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(POS.immutable()); + + for (int i = 0; i < 64 && !ends.isEmpty(); i++) { + ends.forEach((pos) -> { + setWithoutUpdate(world, pos, AIR); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + } + BlockPos p = pos.above(); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + }); + ends.clear(); + ends.addAll(add); + add.clear(); + } + } + // Vines + else if (state.getBlock() instanceof BaseVineBlock) { + while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + } + } + // Falling blocks + else if (state.getBlock() instanceof FallingBlock) { + BlockState falling = state; + + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + + int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); + if (ray > 32) { + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + if (world.getRandom().nextBoolean()) { + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + } + } + else { + POS.setY(y); + BlockState replacement = AIR; + for (Direction dir : BlocksHelper.HORIZONTAL) { + state = world.getBlockState(POS.relative(dir)); + if (!state.getFluidState().isEmpty()) { + replacement = state; + break; + } + } + setWithoutUpdate(world, POS, replacement); + POS.setY(y - ray); + setWithoutUpdate(world, POS, falling); + } + } + // Blocks without support + else { + // Blue Vine + if (state.getBlock() instanceof BlueVineBlock) { + while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + // Double plants + if (state.getBlock() instanceof BaseDoublePlantBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + setWithoutUpdate(world, POS, AIR); + } + // Other blocks + else { + setWithoutUpdate(world, POS, getAirOrFluid(state)); + } + } + } } - } - + }); + doubleCheck.forEach((pos) -> { if (!world.getBlockState(pos).canSurvive(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + setWithoutUpdate(world, pos, AIR); } }); } - + private static BlockState getAirOrFluid(BlockState state) { return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } + + private static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + synchronized (world) { + BlocksHelper.setWithoutUpdate(world, pos, state); + } + } } diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index 1b8cb09d..f7439249 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.RandomValueBounds; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import ru.betterend.registry.EndItems; public class LootTableUtil { @@ -16,13 +16,13 @@ public class LootTableUtil { LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { if (END_CITY_TREASURE_ID.equals(id)) { FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); + builder.setRolls(UniformGenerator.between(0, 5)); builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); supplier.withPool(builder); builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); + builder.setRolls(UniformGenerator.between(0, 5)); builder.withCondition(LootItemRandomChanceCondition.randomChance(0.1f).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_GRASPING_AT_STARS).build()); diff --git a/src/main/java/ru/betterend/util/ShuffelingListExtended.java b/src/main/java/ru/betterend/util/ShuffelingListExtended.java new file mode 100644 index 00000000..2e265ff3 --- /dev/null +++ b/src/main/java/ru/betterend/util/ShuffelingListExtended.java @@ -0,0 +1,11 @@ +package ru.betterend.util; + +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +public interface ShuffelingListExtended { + public boolean isEmpty(); + public U getOne(); +} diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index e2c210b5..b0e33d89 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -5,14 +5,22 @@ import net.minecraft.world.level.biome.Biome; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; import ru.betterend.config.Configs; +import ru.betterend.registry.EndFeatures; public class EndBiome extends BCLBiome { - public EndBiome(BCLBiomeDef definition) { - super(definition.loadConfigValues(Configs.BIOME_CONFIG)); + public EndBiome(BCLBiomeDef def) { + super(updateDef(def)); + } public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { super(id, biome, fogDensity, genChance); this.addCustomData("has_caves", hasCaves); } + + private static BCLBiomeDef updateDef(BCLBiomeDef def) { + def.loadConfigValues(Configs.BIOME_CONFIG); + EndFeatures.addDefaultFeatures(def); + return def; + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index e25ea7db..9f19ed15 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,9 +1,7 @@ package ru.betterend.world.biome.cave; -import java.util.Random; - import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.entity.ai.behavior.ShufflingList; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; @@ -12,12 +10,15 @@ import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.features.BCLFeature; import ru.betterend.BetterEnd; import ru.betterend.registry.EndSounds; +import ru.betterend.util.ShuffelingListExtended; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; +import java.util.Random; + public class EndCaveBiome extends EndBiome { - private WeightedList> floorFeatures = new WeightedList>(); - private WeightedList> ceilFeatures = new WeightedList>(); + final private ShufflingList> floorFeatures = new ShufflingList<>(); + final private ShufflingList> ceilFeatures = new ShufflingList<>(); public EndCaveBiome(BCLBiomeDef definition) { super(makeDef(definition)); @@ -42,12 +43,12 @@ public class EndCaveBiome extends EndBiome { ceilFeatures.add(feature, weight); } - public Feature getFloorFeature(Random random) { - return floorFeatures.isEmpty() ? null : floorFeatures.getOne(random); + public Feature getFloorFeature() { + return ((ShuffelingListExtended>)floorFeatures).isEmpty() ? null : ((ShuffelingListExtended>)floorFeatures).getOne(); } - public Feature getCeilFeature(Random random) { - return ceilFeatures.isEmpty() ? null : ceilFeatures.getOne(random); + public Feature getCeilFeature() { + return ((ShuffelingListExtended>)ceilFeatures).isEmpty() ? null : ((ShuffelingListExtended>)ceilFeatures).getOne(); } public float getFloorDensity() { diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index b58474a3..d8e9f498 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; @@ -29,8 +30,9 @@ public class BiomeIslandFeature extends DefaultFeature { private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Biome biome = world.getBiome(pos); SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 839f6120..945f427d 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -5,6 +5,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -14,8 +15,10 @@ import ru.betterend.registry.EndBlocks; public class CavePumpkinFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.above()).is(TagAPI.GEN_TERRAIN) || !world.isEmptyBlock(pos) || !world.isEmptyBlock(pos.below())) { return false; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 4be8dfdd..097db624 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; @@ -75,8 +76,10 @@ public class CrashedShipFeature extends NBTStructureFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BoundingBox bounds = makeBox(center); @@ -88,7 +91,7 @@ public class CrashedShipFeature extends NBTStructureFeature { StructureTemplate structure = getStructure(world, center, random); Rotation rotation = getRotation(world, center, random); Mirror mirror = getMirror(world, center, random); - BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + BlockPos offset = StructureTemplate.transform(new BlockPos(structure.getSize()), mirror, rotation, BlockPos.ZERO); center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror); center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); @@ -97,10 +100,10 @@ public class CrashedShipFeature extends NBTStructureFeature { bounds = StructureHelper.intersectBoxes(bounds, structB); addStructureData(placementData); - structure.placeInWorldChunk(world, center, placementData.setBoundingBox(bounds), random); + structure.placeInWorld(world, center, center, placementData.setBoundingBox(bounds), random, 2); StructureHelper.erodeIntense(world, bounds, random); - BlockFixer.fixBlocks(world, new BlockPos(bounds.x0, bounds.y0, bounds.z0), new BlockPos(bounds.x1, bounds.y1, bounds.z1)); + BlockFixer.fixBlocks(world, new BlockPos(bounds.minX(), bounds.minY(), bounds.minZ()), new BlockPos(bounds.maxX(), bounds.maxY(), bounds.maxZ())); return true; } diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 9912e3be..9f506a10 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,8 +27,10 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index c0807972..93362b72 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,8 +27,10 @@ public abstract class InvertedScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 523e4dac..ef31a912 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.NeonCactusPlantBlock; @@ -13,7 +14,10 @@ import ru.betterend.registry.EndBlocks; public class NeonCactusFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState ground = world.getBlockState(pos.below()); if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 620be106..4ff0a207 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -56,8 +57,10 @@ public abstract class ScatterFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); center = getCenterGround(world, center); if (!canSpawn(world, center)) { diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index 25ca6aed..a0e551c2 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -34,8 +35,10 @@ public class SilkMothNestFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index d9dee786..c73fb652 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,7 +27,10 @@ public abstract class WallScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index d3a78ecc..92611c31 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,10 +36,12 @@ public class BushFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) + && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 67daa795..e50fdee5 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -39,10 +40,12 @@ public class BushWithOuterFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) + && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index a3c8018a..1d75c1d8 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; @@ -19,9 +20,11 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; MutableBlockPos mut = new MutableBlockPos().set(pos); diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index ec9b0682..e513327f 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -19,9 +20,11 @@ import ru.betterend.registry.EndBlocks; public class Lumecorn extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; int height = MHelper.randRange(4, 7, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 21e7d95e..5487d04e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -39,9 +40,11 @@ public class TenaneaBushFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 5ccdefe2..8e9ed62a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -7,6 +7,7 @@ import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -20,8 +21,10 @@ import ru.betterend.registry.EndBlocks; public class BigAuroraCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index 7724bae3..b843d16d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -25,7 +26,10 @@ public class DesertLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(8.0, 15.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); @@ -163,7 +167,7 @@ public class DesertLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); @@ -205,7 +209,6 @@ public class DesertLakeFeature extends DefaultFeature { || state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + || state.getMaterial().equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 55075fcb..3a0e2c25 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -1,13 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -19,13 +17,18 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import java.util.Random; + public class EndLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); @@ -163,7 +166,7 @@ public class EndLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); @@ -199,7 +202,6 @@ public class EndLakeFeature extends DefaultFeature { || state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + || state.getMaterial().equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index f0b9e545..8e387bfe 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,7 +25,10 @@ import ru.betterend.registry.EndBlocks; public class FallenPillarFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index af955ffe..00bae11b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.BiomeAPI; import ru.bclib.sdf.SDF; @@ -22,8 +23,11 @@ import ru.betterend.registry.EndFeatures; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); int minY = getYOnSurface(world, pos.getX(), pos.getZ()); int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); @@ -64,7 +68,7 @@ public class FloatingSpireFeature extends SpireFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 61da80ad..ad7fbb3e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -47,9 +48,11 @@ public class GeyserFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - pos = getPosOnSurfaceWG(world, pos); + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final WorldGenLevel world = featureConfig.level(); + final BlockPos pos = getPosOnSurfaceWG(world, featureConfig.origin()); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); if (pos.getY() < 10) { return false; @@ -241,7 +244,7 @@ public class GeyserFeature extends DefaultFeature { } } - EndFeatures.SULPHURIC_LAKE.getFeature().place(world, chunkGenerator, random, pos, null); + EndFeatures.SULPHURIC_LAKE.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, pos, null)); double distance = radius1 * 1.7; BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index c76424ff..565b862e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; @@ -34,8 +35,10 @@ public class IceStarFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 840f53f1..0616e35e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -21,8 +22,10 @@ import ru.betterend.registry.EndBlocks; public class ObsidianBoulderFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 3106db14..2c4db528 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,9 +21,14 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class ObsidianPillarBasementFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 0bbb70ea..b045ce0e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFCoordModify; @@ -35,8 +36,10 @@ public class OreLayerFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 8fceba8d..b652985d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -21,7 +22,10 @@ public class SingleBlockFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 447138b1..f63d9c19 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -17,8 +18,10 @@ import ru.betterend.registry.EndBlocks; public class SmaragdantCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index bf14a674..4b92b35d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.BiomeAPI; @@ -32,8 +33,11 @@ public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN) || !world.getBlockState(pos.below(6)).is(TagAPI.GEN_TERRAIN)) { @@ -68,7 +72,7 @@ public class SpireFeature extends DefaultFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 06e5bcfb..bf018b8b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.StalactiteBlock; @@ -28,8 +29,10 @@ public class StalactiteFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index eefaf3e7..d81440eb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -19,8 +20,10 @@ import ru.betterend.registry.EndBlocks; public class SulphurHillFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index a314095b..365c89c8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -32,8 +33,10 @@ public class SulphuricCaveFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int radius = MHelper.randRange(10, 30, random); int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 07d49e00..7e3ba1b0 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -1,17 +1,13 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Fluids; import ru.bclib.api.TagAPI; @@ -23,13 +19,18 @@ import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; +import java.util.Set; + public class SulphuricLakeFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); blockPos = getPosOnSurfaceWG(world, blockPos); if (blockPos.getY() < 57) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 61bdc174..e3b98484 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -1,12 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -15,10 +13,14 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 00d5f28a..da5274a6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -29,7 +30,10 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); int sx = (pos.getX() >> 4) << 4; @@ -109,9 +113,9 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -125,9 +129,9 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 964fa6b3..6c6509e1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -1,12 +1,7 @@ package ru.betterend.world.features.terrain.caves; -import java.util.List; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -15,9 +10,9 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; @@ -30,6 +25,10 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.List; +import java.util.Random; +import java.util.Set; + public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); @@ -37,7 +36,10 @@ public abstract class EndCaveFeature extends DefaultFeature { private static final Vec3i[] SPHERE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -58,19 +60,17 @@ public abstract class EndCaveFeature extends DefaultFeature { if (!caveBlocks.isEmpty()) { if (biome != null) { setBiomes(world, biome, caveBlocks); - Set floorPositions = Sets.newHashSet(); - Set ceilPositions = Sets.newHashSet(); - MutableBlockPos mut = new MutableBlockPos(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - floorPositions.add(mut.immutable()); + Set floorPositions = Sets.newConcurrentHashSet(); + Set ceilPositions = Sets.newConcurrentHashSet(); + caveBlocks.parallelStream().forEach((bpos) -> { + if (world.getBlockState(bpos).getMaterial().isReplaceable()) { + BlockPos side = bpos.below(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + floorPositions.add(side); } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - ceilPositions.add(mut.immutable()); + side = bpos.above(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + ceilPositions.add(side); } } }); @@ -94,9 +94,9 @@ public abstract class EndCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -110,9 +110,9 @@ public abstract class EndCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java index 58364bd6..05d2179f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -30,47 +31,45 @@ public class RoundCaveFeature extends EndCaveFeature { double hr = radius * 0.75; double nr = radius * 0.25; - BlockState state; - MutableBlockPos bpos = new MutableBlockPos(); - Set blocks = Sets.newHashSet(); - for (int x = x1; x <= x2; x++) { - int xsq = x - center.getX(); - xsq *= xsq; + int dx = x2 - x1 + 1; + int dz = z2 - z1 + 1; + int count = dx * dz; + Set blocks = Sets.newConcurrentHashSet(); + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos bpos = new MutableBlockPos(); + int x = (index % dx) + x1; + int z = (index / dx) + z1; bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - center.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - center.getY(); - ysq *= 1.6; - ysq *= ysq; + bpos.setZ(z); + int xsq = MHelper.sqr(x - center.getX()); + int zsq = MHelper.sqr(z - center.getZ()); + int dxz = xsq + zsq; + BlockState state; + for (int y = y1; y <= y2; y++) { + int ysq = (int) MHelper.sqr((y - center.getY()) * 1.6); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + double dist = dxz + ysq; + if (dist < r * r) { bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - state = world.getBlockState(bpos); - if (isReplaceable(state) && !isWaterNear(world, bpos)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - blocks.add(bpos.immutable()); - - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() + 1); - state = world.getBlockState(bpos); - } - - bpos.setY(y - 1); - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } + state = world.getBlockState(bpos); + if (isReplaceable(state) && !isWaterNear(world, bpos)) { + blocks.add(bpos.immutable()); + + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() + 1); + state = world.getBlockState(bpos); + } + + bpos.setY(y - 1); + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); } } } } - } + }); + blocks.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); return blocks; } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index ed518538..c5acfec3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -1,29 +1,33 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Map; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Maps; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; +import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + public class TunelCaveFeature extends EndCaveFeature { private Set generate(WorldGenLevel world, BlockPos center, Random random) { int cx = center.getX() >> 4; @@ -31,42 +35,56 @@ public class TunelCaveFeature extends EndCaveFeature { if ((long) cx * (long) cx + (long) cz + (long) cz < 256) { return Sets.newHashSet(); } + int x1 = cx << 4; int z1 = cz << 4; int x2 = x1 + 16; int z2 = z1 + 16; - int y2 = world.getHeight(); + Random rand = new Random(world.getSeed()); OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); - Set positions = Sets.newHashSet(); - MutableBlockPos pos = new MutableBlockPos(); - for (int x = x1; x < x2; x++) { - pos.setX(x); - for (int z = z1; z < z2; z++) { - pos.setZ(z); - for (int y = 0; y < y2; y++) { + Set positions = Sets.newConcurrentHashSet(); + + float a = hasCaves(world, new BlockPos(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, new BlockPos(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, new BlockPos(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, new BlockPos(x2, 0, z2)) ? 1F : 0F; + + ChunkAccess chunk = world.getChunk(cx, cz); + IntStream.range(0, 256).parallel().forEach(index -> { + MutableBlockPos pos = new MutableBlockPos(); + int x = index & 15; + int z = index >> 4; + int wheight = chunk.getHeight(Types.WORLD_SURFACE_WG, x, z); + float dx = x / 16F; + float dz = z / 16F; + pos.setX(x + x1); + pos.setZ(z + z1); + float da = Mth.lerp(dx, a, b); + float db = Mth.lerp(dx, c, d); + float density = 1 - Mth.lerp(dz, da, db); + if (density < 0.5) { + for (int y = 0; y < wheight; y++) { pos.setY(y); - float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); - float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; - float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; - vert *= vert; - if (val + vert + dist < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); + if (gradient > 0.5) { + break; + } + float val = Mth.abs((float) noiseH.eval(pos.getX() * 0.02, y * 0.01, pos.getZ() * 0.02)); + float vert = Mth.sin((y + (float) noiseV.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * 20) * 0.1F) * 0.9F; + float dist = (float) noiseD.eval(pos.getX() * 0.1, y * 0.1, pos.getZ() * 0.1) * 0.12F; + val = (val + vert * vert + dist) + density + gradient; + if (val < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { positions.add(pos.immutable()); - int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (height < pos.getY() + 4) { - while (pos.getY() < height && noWaterNear(world, pos)) { - pos.setY(pos.getY() + 1); - BlocksHelper.setWithoutUpdate(world, pos, AIR); - } - } } } } - } + }); + positions.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); + return positions; } @@ -88,7 +106,10 @@ public class TunelCaveFeature extends EndCaveFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -168,9 +189,9 @@ public class TunelCaveFeature extends EndCaveFeature { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -185,11 +206,24 @@ public class TunelCaveFeature extends EndCaveFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); } + + protected boolean hasCaves(WorldGenLevel world, BlockPos pos) { + return hasCavesInBiome(world, pos.offset(-8, 0, -8)) && + hasCavesInBiome(world, pos.offset(8, 0, -8)) && + hasCavesInBiome(world, pos.offset(-8, 0, 8)) && + hasCavesInBiome(world, pos.offset(8, 0, 8)); + } + + protected boolean hasCavesInBiome(WorldGenLevel world, BlockPos pos) { + Biome biome = world.getBiome(pos); + BCLBiome endBiome = BiomeAPI.getFromBiome(biome); + return endBiome.getCustomData("has_caves", true); + } } diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index b03576fe..d41dab55 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -42,9 +43,11 @@ public class DragonTreeFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(10, 25, random); diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 849cb05e..33853a15 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -15,6 +15,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -33,9 +34,11 @@ public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(5, 10, random); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 038ae0fc..90b07868 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -13,6 +13,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.AABB; import ru.bclib.api.TagAPI; @@ -34,9 +35,11 @@ public class HelixTreeFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 3680e707..8bcd9e6e 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -12,6 +12,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -33,9 +34,11 @@ public class JellyshroomFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 9485d5ce..4f916282 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,8 +36,10 @@ public class LacugroveFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index b8a8ffc6..b01e66ee 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -1,30 +1,21 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFDisplacement; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,6 +25,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class LucerniaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; @@ -42,9 +37,12 @@ public class LucerniaFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(12, 20, random); diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index fd076dbc..abea454d 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -1,29 +1,16 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFBinary; -import ru.bclib.sdf.operator.SDFCoordModify; -import ru.bclib.sdf.operator.SDFFlatWave; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSmoothUnion; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; -import ru.bclib.sdf.operator.SDFUnion; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.sdf.primitive.SDFPrimitive; import ru.bclib.sdf.primitive.SDFSphere; @@ -36,6 +23,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class MossyGlowshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final Vector3f CENTER = new Vector3f(); @@ -49,8 +40,10 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFPrimitive ROOTS; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState down = world.getBlockState(blockPos.below()); if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) return false; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index 178bc53c..a3b24fda 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -1,18 +1,13 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -30,13 +25,20 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) { return false; } diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 7f9c7ecb..9a1016a0 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -1,30 +1,21 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFDisplacement; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,6 +25,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class TenaneaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; @@ -41,9 +36,11 @@ public class TenaneaFeature extends DefaultFeature { private static final List SPLINE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(7, 10, random); diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index f2f7366e..db947168 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -1,30 +1,19 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFFlatWave; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSmoothUnion; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; -import ru.bclib.sdf.operator.SDFUnion; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,15 +23,22 @@ import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final List SPLINE; private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 602a095b..c5f81571 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -63,7 +63,8 @@ public class BetterEndBiomeSource extends BiomeSource { private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { + BCLBiome bclBiome = BiomeAPI.getBiome(biomeRegistry.getKey(biome)); + if (bclBiome instanceof EndBiome) { list.add(biome); } }); diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index f67a71d4..d137ea66 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; @@ -26,16 +27,16 @@ public class EternalPortalStructure extends FeatureBaseStructure { private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { + protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { long x = (long) chunkPos.x * (long) chunkPos.x; long z = (long) chunkPos.z * (long) chunkPos.z; if (x + z < 1024L) { return false; } - if (chunkGenerator.getBaseHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Types.WORLD_SURFACE_WG) < 10) { + if (chunkGenerator.getBaseHeight(pos.getBlockX(8), pos.getBlockX(8), Heightmap.Types.WORLD_SURFACE_WG, levelHeightAccessor) < 10) { return false; } - return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); + return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, pos, biome, chunkPos, featureConfig, levelHeightAccessor); } @Override @@ -44,19 +45,21 @@ public class EternalPortalStructure extends FeatureBaseStructure { } public static class PortalStructureStart extends StructureStart { - public PortalStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public PortalStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { + super(feature, pos, references, seed); } + @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); + int z =chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 4) { this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); } - this.calculateBoundingBox(); + //bbox is calculated lazy on get + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 219ec6f5..64690626 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -3,6 +3,7 @@ package ru.betterend.world.structures.features; import java.util.Random; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Blocks; @@ -22,12 +23,12 @@ public abstract class FeatureBaseStructure extends StructureFeature= 20; + protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { + return getGenerationHeight(pos, chunkGenerator, levelHeightAccessor) >= 20; } - private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { - Random random = new Random((long) (chunkX + chunkZ * 10387313)); + private static int getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { + Random random = new Random((long) (chunkPos.x + chunkPos.z * 10387313)); Rotation blockRotation = Rotation.getRandom(random); int i = 5; int j = 5; @@ -40,12 +41,12 @@ public abstract class FeatureBaseStructure extends StructureFeature { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public StarStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { + super(feature, pos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); this.pieces.add(piece); - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index d4397767..c9e96d74 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MegaLakeSmallStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(20, 40, random); float depth = MHelper.randRange(5, 10, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index 2d554d4c..d536fe46 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MegaLakeStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(32, 64, random); float depth = MHelper.randRange(7, 15, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index a968c7d1..5be93f26 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MountainStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z =chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index cbb6735a..d78bd5ca 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -25,15 +27,15 @@ public class PaintedMountainStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 50) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random); @@ -44,7 +46,8 @@ public class PaintedMountainStructure extends FeatureBaseStructure { } this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 40e28a3c..cc33b475 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -4,6 +4,8 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -26,21 +28,22 @@ public abstract class SDFStructureFeature extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { BlockPos start = new BlockPos(x, y, z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index b5ce64f8..957de957 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -2,11 +2,12 @@ package ru.betterend.world.structures.piece; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructurePiece; public abstract class BasePiece extends StructurePiece { - protected BasePiece(StructurePieceType type, int i) { - super(type, i); + protected BasePiece(StructurePieceType type, int i, BoundingBox boundingBox) { + super(type, i, boundingBox); } protected BasePiece(StructurePieceType type, CompoundTag tag) { diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index a964e0e7..86b9220b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -25,26 +26,26 @@ public class CavePiece extends BasePiece { private float radius; public CavePiece(BlockPos center, float radius, int id) { - super(EndStructures.CAVE_PIECE, id); + super(EndStructures.CAVE_PIECE, id, null); this.center = center; this.radius = radius; this.noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); makeBoundingBox(); } - public CavePiece(StructureManager manager, CompoundTag tag) { + public CavePiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int x1 = MHelper.max(this.boundingBox.x0, blockBox.x0); - int z1 = MHelper.max(this.boundingBox.z0, blockBox.z0); - int x2 = MHelper.min(this.boundingBox.x1, blockBox.x1); - int z2 = MHelper.min(this.boundingBox.z1, blockBox.z1); - int y1 = this.boundingBox.y0; - int y2 = this.boundingBox.y1; + int x1 = MHelper.max(this.boundingBox.minX(), blockBox.minX()); + int z1 = MHelper.max(this.boundingBox.minZ(), blockBox.minZ()); + int x2 = MHelper.min(this.boundingBox.maxX(), blockBox.maxX()); + int z2 = MHelper.min(this.boundingBox.maxZ(), blockBox.maxZ()); + int y1 = this.boundingBox.minY(); + int y2 = this.boundingBox.maxY(); double hr = radius * 0.75; double nr = radius * 0.25; @@ -83,7 +84,7 @@ public class CavePiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index e7a77628..9fb60aab 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -5,6 +5,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -32,8 +33,8 @@ public class CrystalMountainPiece extends MountainPiece { top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, manager, tag); + public CrystalMountainPiece(ServerLevel serverLevel, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, serverLevel, tag); } @Override diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index b304d42e..e4a17575 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -8,9 +8,11 @@ import com.google.common.collect.Maps; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -46,7 +48,7 @@ public class LakePiece extends BasePiece { private ResourceLocation biomeID; public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { - super(EndStructures.LAKE_PIECE, random.nextInt()); + super(EndStructures.LAKE_PIECE, random.nextInt(), null); this.center = center; this.radius = radius; this.depth = depth; @@ -57,13 +59,13 @@ public class LakePiece extends BasePiece { makeBoundingBox(); } - public LakePiece(StructureManager manager, CompoundTag tag) { + public LakePiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.LAKE_PIECE, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); @@ -84,10 +86,10 @@ public class LakePiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; - int sx = chunkPos.x << 4; - int sz = chunkPos.z << 4; + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); + int sx = SectionPos.sectionToBlockCoord(chunkPos.x); + int sz = SectionPos.sectionToBlockCoord(chunkPos.z); MutableBlockPos mut = new MutableBlockPos(); ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { @@ -144,8 +146,8 @@ public class LakePiece extends BasePiece { } private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); for (int x = 0; x < 16; x++) { mut.setX(x); for (int z = 0; z < 16; z++) { diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index bc2ef668..791d9ff3 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; @@ -34,7 +35,7 @@ public abstract class MountainPiece extends BasePiece { protected int seed2; public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { - super(type, random.nextInt()); + super(type, random.nextInt(), null); this.center = center; this.radius = radius; this.height = height; @@ -47,13 +48,13 @@ public abstract class MountainPiece extends BasePiece { makeBoundingBox(); } - public MountainPiece(StructurePieceType type, StructureManager manager, CompoundTag tag) { + public MountainPiece(StructurePieceType type, ServerLevel serverLevel, CompoundTag tag) { super(type, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("height", height); @@ -129,9 +130,11 @@ public abstract class MountainPiece extends BasePiece { private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); + int minY = MHelper.floor(center.getY() - radius); int minZ = MHelper.floor(center.getZ() - radius); int maxX = MHelper.floor(center.getX() + radius + 1); + int maxY = MHelper.floor(center.getY() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BoundingBox(minX, minZ, maxX, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index bc5388f3..31710bfa 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -3,9 +3,11 @@ package ru.betterend.world.structures.piece; import java.util.Random; import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -30,7 +32,7 @@ public class NBTPiece extends BasePiece { private boolean cover; public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { - super(EndStructures.NBT_PIECE, random.nextInt()); + super(EndStructures.NBT_PIECE, random.nextInt(), null); this.structureID = structureID; this.structure = structure; this.rotation = Rotation.getRandom(random); @@ -41,13 +43,13 @@ public class NBTPiece extends BasePiece { makeBoundingBox(); } - public NBTPiece(StructureManager manager, CompoundTag tag) { + public NBTPiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.NBT_PIECE, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.putString("structureID", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); @@ -69,16 +71,18 @@ public class NBTPiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - BoundingBox bounds = new BoundingBox(blockBox); - bounds.y1 = this.boundingBox.y1; - bounds.y0 = this.boundingBox.y0; + BoundingBox bounds = BoundingBox.fromCorners( + new Vec3i(blockBox.minX(), this.boundingBox.minY(), blockBox.minZ()), + new Vec3i(blockBox.maxX(), this.boundingBox.maxX(), blockBox.maxZ()) + ); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - structure.placeInWorldChunk(world, pos, placementData, random); + structure.placeInWorld(world, pos, pos, placementData, random, 2); if (erosion > 0) { - bounds.x1 = MHelper.min(bounds.x1, boundingBox.x1); - bounds.x0 = MHelper.max(bounds.x0, boundingBox.x0); - bounds.z1 = MHelper.min(bounds.z1, boundingBox.z1); - bounds.z0 = MHelper.max(bounds.z0, boundingBox.z0); + int x1 = MHelper.min(bounds.maxX(), boundingBox.maxX()); + int x0 = MHelper.max(bounds.minX(), boundingBox.minX()); + int z1 = MHelper.min(bounds.maxZ(), boundingBox.maxZ()); + int z0 = MHelper.max(bounds.minZ(), boundingBox.minZ()); + bounds = BoundingBox.fromCorners(new Vec3i(x0, bounds.minY(), z0), new Vec3i(x1, bounds.maxY(), z1)); StructureHelper.erode(world, bounds, erosion, random); } if (cover) { diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index cbbaa91d..c10e9740 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -28,13 +29,13 @@ public class PaintedMountainPiece extends MountainPiece { this.slises = slises; } - public PaintedMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, manager, tag); + public PaintedMountainPiece(ServerLevel serverLevel, CompoundTag tag) { + super(EndStructures.PAINTED_MOUNTAIN_PIECE, serverLevel, tag); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { - super.addAdditionalSaveData(tag); + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + super.addAdditionalSaveData(serverLevel, tag); ListTag slise = new ListTag(); for (BlockState state: slises) { slise.add(NbtUtils.writeBlockState(state)); diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 08a4a100..5209c40e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -5,6 +5,7 @@ import java.util.function.Consumer; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -18,19 +19,19 @@ public class VoxelPiece extends BasePiece { private StructureWorld world; public VoxelPiece(Consumer function, int id) { - super(EndStructures.VOXEL_PIECE, id); + super(EndStructures.VOXEL_PIECE, id, null); world = new StructureWorld(); function.accept(world); this.boundingBox = world.getBounds(); } - public VoxelPiece(StructureManager manager, CompoundTag tag) { + public VoxelPiece(ServerLevel level, CompoundTag tag) { super(EndStructures.VOXEL_PIECE, tag); this.boundingBox = world.getBounds(); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("world", world.toBNT()); } diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 90841b95..59c2742e 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -19,19 +19,19 @@ public class SulphuricSurfaceBuilder extends SurfaceBuilderThis can be used to replace existing vanilla armor models and textures conditionally, however each {@link Item} + * instance can only allow one {@link ModelProvider} or {@link TextureProvider} respectively, causing potential conflicts + * with other mods if you replace the model or texture for vanilla items. Consider using a separate item instead.

+ * + *

A custom model would probably also require a custom texture to go along it, the model will use the vanilla texture if it is undefined.

+ * + *

Since armor textures identifier in vanilla is hardcoded to be in the {@code minecraft} namespace, this registry can also be + * used to use a custom namespace if desired.

+ */ +@Environment(EnvType.CLIENT) +public final class ArmorRenderingRegistry { + private ArmorRenderingRegistry() { + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Item... items) { + registerModel(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerModel(provider, items); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Item... items) { + registerTexture(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerTexture(provider, items); + } + + /** + * Register simple armor items to use the vanilla armor file name under the mods namespace. + * + * @param identifier The namespace + path to use for the armor texture location. + * @param items the items to be registered + */ + public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { + registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { + return new ResourceLocation(identifier.getNamespace(), "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer ? 2 : 1) + (suffix == null ? "" : "_" + suffix) + ".png"); + }, items); + } + + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default model that vanilla provides + * @return The model of the armor piece. + */ + @NotNull + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); + } + + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param secondLayer True if using the second texture layer + * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. + */ + @NotNull + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface ModelProvider { + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default vanilla armor model + * @return The model of the armor piece. Should never be null. + */ + @NotNull + HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface TextureProvider { + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier. Should never be null. + */ + @NotNull + ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture); + } +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java new file mode 100644 index 00000000..2f076f8a --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import org.jetbrains.annotations.Nullable; + +public interface ArmorProviderExtensions { + @Nullable + ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); + + @Nullable + ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); + + void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); + + void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java new file mode 100644 index 00000000..35ae8c14 --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import java.util.Objects; + +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import org.jetbrains.annotations.Nullable; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public final class ArmorRenderingRegistryImpl { + private ArmorRenderingRegistryImpl() { + } + + public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); + } + } + + public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); + } + } + + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); + + if (provider != null) { + return provider.getArmorModel(entity, stack, slot, defaultModel); + } + } + + return defaultModel; + } + + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); + + if (provider != null) { + return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + } + + return defaultTexture; + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java new file mode 100644 index 00000000..5b678eee --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.mixin.client.rendering; + +import com.mojang.blaze3d.vertex.PoseStack; +import java.util.Map; +import java.util.Objects; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; + +@Mixin(HumanoidArmorLayer.class) +@Environment(EnvType.CLIENT) +public abstract class MixinArmorFeatureRenderer extends RenderLayer { + @Shadow + @Final + private static Map ARMOR_LOCATION_CACHE; + + public MixinArmorFeatureRenderer(RenderLayerParent context) { + super(context); + + } + + @Unique + private LivingEntity storedEntity; + @Unique + private EquipmentSlot storedSlot; + + @Inject(method = "render", at = @At("HEAD")) + private void storeEntity(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We store the living entity wearing the armor before we render + this.storedEntity = livingEntity; + } + + @Inject(method = "renderArmorPiece", at = @At("HEAD")) + private void storeSlot(PoseStack matrices, MultiBufferSource vertexConsumers, LivingEntity livingEntity, EquipmentSlot slot, int i, HumanoidModel bipedEntityModel, CallbackInfo ci) { + // We store the current armor slot that is rendering before we render each armor piece + this.storedSlot = slot; + } + + @Inject(method = "render", at = @At("RETURN")) + private void removeStored(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We remove the stored data after we render + this.storedEntity = null; + this.storedSlot = null; + } + + @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) + private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { + ItemStack stack = storedEntity.getItemBySlot(slot); + + HumanoidModel defaultModel = cir.getReturnValue(); + HumanoidModel model = ArmorRenderingRegistry.getArmorModel(storedEntity, stack, slot, defaultModel); + + if (model != defaultModel) { + cir.setReturnValue(model); + } + } + + @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void getArmorTexture(ArmorItem armorItem, boolean secondLayer, /* @Nullable */ String suffix, CallbackInfoReturnable cir, String vanillaIdentifier) { + String texture = ArmorRenderingRegistry.getArmorTexture(storedEntity, storedEntity.getItemBySlot(storedSlot), storedSlot, secondLayer, suffix, new ResourceLocation(vanillaIdentifier)).toString(); + + if (!Objects.equals(texture, vanillaIdentifier)) { + cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); + } + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java new file mode 100644 index 00000000..aa5c6bab --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + +package shadow.fabric.mixin.client.rendering; + + +import net.minecraft.world.item.Item; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; + + +@Mixin(Item.class) +public class MixinItem implements ArmorProviderExtensions { + @Unique + private ArmorRenderingRegistry.ModelProvider armorModelProvider; + @Unique + private ArmorRenderingRegistry.TextureProvider armorTextureProvider; + + @Override + public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { + return armorModelProvider; + } + + @Override + public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { + return armorTextureProvider; + } + + @Override + public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { + armorModelProvider = provider; + } + + @Override + public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { + armorTextureProvider = provider; + } +} \ No newline at end of file diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 084bbab4..6fd0fc05 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -2,23 +2,23 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.client", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "client": [ "AbstractSoundInstanceAccessor", "ClientPlayNetworkHandlerMixin", - "HumanoidMobRendererMixin", - "ArmorStandRendererMixin", + "HumanoidMobRendererMixin", + "ArmorStandRendererMixin", "ClientRecipeBookMixin", "MinecraftClientMixin", - "PlayerRendererMixin", + "PlayerRendererMixin", "WorldRendererMixin", "MusicTrackerMixin", "AnvilScreenMixin", "BiomeColorsMixin", "ModelLoaderMixin", - "LocalPlayerMixin", - "CapeLayerMixin", - "ItemStackMixin" + "LocalPlayerMixin", + "CapeLayerMixin", + "ItemStackMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index e4d533ea..901e1855 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.common", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "mixins": [ "BiomeGenerationSettingsAccessor", "NoiseBasedChunkGeneratorMixin", @@ -22,7 +22,7 @@ "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", - "SpikeFeatureMixin", + "SpikeFeatureMixin", "ServerLevelMixin", "PlayerListMixin", "AnvilMenuMixin", @@ -31,7 +31,8 @@ "MonsterMixin", "EntityMixin", "PlayerMixin", - "SlimeMixin" + "SlimeMixin", + "ShuffelingListMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.shadow.json b/src/main/resources/betterend.mixins.shadow.json new file mode 100644 index 00000000..08955be4 --- /dev/null +++ b/src/main/resources/betterend.mixins.shadow.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "shadow.fabric.mixin.client.rendering", + "compatibilityLevel": "JAVA_16", + "client": [ + "MixinArmorFeatureRenderer", + "MixinItem" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json new file mode 100644 index 00000000..538c9e24 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -0,0 +1,31 @@ +{ + "replace": "false", + "values": [ + "betterend:amaranita_cap", + "betterend:amaranita_hymenophore", + "betterend:amaranita_lantern", + "betterend:aurant_polypore", + "betterend:blue_vine_lantern", + "betterend:filalux_lantern", + "betterend:hydralux_petal_block", + "betterend:hydralux_petal_block_black", + "betterend:hydralux_petal_block_blue", + "betterend:hydralux_petal_block_brown", + "betterend:hydralux_petal_block_cyan", + "betterend:hydralux_petal_block_gray", + "betterend:hydralux_petal_block_green", + "betterend:hydralux_petal_block_light_blue", + "betterend:hydralux_petal_block_light_gray", + "betterend:hydralux_petal_block_lime", + "betterend:hydralux_petal_block_magenta", + "betterend:hydralux_petal_block_orange", + "betterend:hydralux_petal_block_pink", + "betterend:hydralux_petal_block_purple", + "betterend:hydralux_petal_block_red", + "betterend:hydralux_petal_block_white", + "betterend:hydralux_petal_block_yellow", + "betterend:mossy_glowshroom_cap", + "betterend:mossy_glowshroom_hymenophore", + "betterend:purple_polypore" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json new file mode 100644 index 00000000..b90eeee2 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json @@ -0,0 +1,14 @@ +{ + "replace": "false", + "values": [ + "betterend:amber_root_seed", + "betterend:blossom_berry_seed", + "betterend:chorus_mushroom_seed", + "betterend:dragon_tree_leaves", + "betterend:lacugrove_leaves", + "betterend:lucernia_leaves", + "betterend:pythadendron_leaves", + "betterend:shadow_berry", + "betterend:tenanea_leaves" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 00000000..a6e13734 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,251 @@ +{ + "replace": "false", + "values": [ + "betterend:aeternium_anvil", + "betterend:aeternium_block", + "betterend:amber_block", + "betterend:amber_moss", + "betterend:amber_moss_path", + "betterend:andesite_lantern", + "betterend:andesite_pedestal", + "betterend:aurora_crystal", + "betterend:azure_jadestone", + "betterend:azure_jadestone_bricks", + "betterend:azure_jadestone_bricks_slab", + "betterend:azure_jadestone_bricks_stairs", + "betterend:azure_jadestone_bricks_wall", + "betterend:azure_jadestone_button", + "betterend:azure_jadestone_furnace", + "betterend:azure_jadestone_lantern", + "betterend:azure_jadestone_pedestal", + "betterend:azure_jadestone_pillar", + "betterend:azure_jadestone_plate", + "betterend:azure_jadestone_polished", + "betterend:azure_jadestone_slab", + "betterend:azure_jadestone_stairs", + "betterend:azure_jadestone_tiles", + "betterend:azure_jadestone_wall", + "betterend:blackstone_lantern", + "betterend:brimstone", + "betterend:cave_moss", + "betterend:cave_moss_path", + "betterend:charcoal_block", + "betterend:chorus_nylium", + "betterend:chorus_nylium_path", + "betterend:crystal_moss", + "betterend:crystal_moss_path", + "betterend:diorite_lantern", + "betterend:diorite_pedestal", + "betterend:dragon_bone_block", + "betterend:dragon_bone_slab", + "betterend:dragon_bone_stairs", + "betterend:end_moss", + "betterend:end_moss_path", + "betterend:end_mycelium", + "betterend:end_mycelium_path", + "betterend:end_stone_furnace", + "betterend:end_stone_lantern", + "betterend:end_stone_smelter", + "betterend:ender_block", + "betterend:eternal_pedestal", + "betterend:flavolite", + "betterend:flavolite_bricks", + "betterend:flavolite_bricks_slab", + "betterend:flavolite_bricks_stairs", + "betterend:flavolite_bricks_wall", + "betterend:flavolite_button", + "betterend:flavolite_furnace", + "betterend:flavolite_lantern", + "betterend:flavolite_pedestal", + "betterend:flavolite_pillar", + "betterend:flavolite_plate", + "betterend:flavolite_polished", + "betterend:flavolite_runed", + "betterend:flavolite_runed_eternal", + "betterend:flavolite_slab", + "betterend:flavolite_stairs", + "betterend:flavolite_tiles", + "betterend:flavolite_wall", + "betterend:gold_chandelier", + "betterend:granite_lantern", + "betterend:granite_pedestal", + "betterend:hydrothermal_vent", + "betterend:infusion_pedestal", + "betterend:iron_bulb_lantern", + "betterend:iron_bulb_lantern_black", + "betterend:iron_bulb_lantern_blue", + "betterend:iron_bulb_lantern_brown", + "betterend:iron_bulb_lantern_cyan", + "betterend:iron_bulb_lantern_gray", + "betterend:iron_bulb_lantern_green", + "betterend:iron_bulb_lantern_light_blue", + "betterend:iron_bulb_lantern_light_gray", + "betterend:iron_bulb_lantern_lime", + "betterend:iron_bulb_lantern_magenta", + "betterend:iron_bulb_lantern_orange", + "betterend:iron_bulb_lantern_pink", + "betterend:iron_bulb_lantern_purple", + "betterend:iron_bulb_lantern_red", + "betterend:iron_bulb_lantern_white", + "betterend:iron_bulb_lantern_yellow", + "betterend:iron_chandelier", + "betterend:jungle_moss", + "betterend:jungle_moss_path", + "betterend:missing_tile", + "betterend:mossy_dragon_bone", + "betterend:mossy_obsidian", + "betterend:pink_moss", + "betterend:pink_moss_path", + "betterend:purpur_lantern", + "betterend:purpur_pedestal", + "betterend:quartz_lantern", + "betterend:quartz_pedestal", + "betterend:respawn_obelisk", + "betterend:rutiscus", + "betterend:rutiscus_path", + "betterend:sandy_jadestone", + "betterend:sandy_jadestone_bricks", + "betterend:sandy_jadestone_bricks_slab", + "betterend:sandy_jadestone_bricks_stairs", + "betterend:sandy_jadestone_bricks_wall", + "betterend:sandy_jadestone_button", + "betterend:sandy_jadestone_furnace", + "betterend:sandy_jadestone_lantern", + "betterend:sandy_jadestone_pedestal", + "betterend:sandy_jadestone_pillar", + "betterend:sandy_jadestone_plate", + "betterend:sandy_jadestone_polished", + "betterend:sandy_jadestone_slab", + "betterend:sandy_jadestone_stairs", + "betterend:sandy_jadestone_tiles", + "betterend:sandy_jadestone_wall", + "betterend:sangnum", + "betterend:sangnum_path", + "betterend:shadow_grass", + "betterend:shadow_grass_path", + "betterend:smaragdant_crystal", + "betterend:smaragdant_crystal_bricks", + "betterend:smaragdant_crystal_bricks_slab", + "betterend:smaragdant_crystal_bricks_stairs", + "betterend:smaragdant_crystal_bricks_wall", + "betterend:smaragdant_crystal_pedestal", + "betterend:smaragdant_crystal_pillar", + "betterend:smaragdant_crystal_polished", + "betterend:smaragdant_crystal_shard", + "betterend:smaragdant_crystal_slab", + "betterend:smaragdant_crystal_stairs", + "betterend:smaragdant_crystal_tiles", + "betterend:smaragdant_crystal_wall", + "betterend:sulphur_crystal", + "betterend:sulphuric_rock", + "betterend:sulphuric_rock_bricks", + "betterend:sulphuric_rock_bricks_slab", + "betterend:sulphuric_rock_bricks_stairs", + "betterend:sulphuric_rock_bricks_wall", + "betterend:sulphuric_rock_button", + "betterend:sulphuric_rock_furnace", + "betterend:sulphuric_rock_lantern", + "betterend:sulphuric_rock_pedestal", + "betterend:sulphuric_rock_pillar", + "betterend:sulphuric_rock_plate", + "betterend:sulphuric_rock_polished", + "betterend:sulphuric_rock_slab", + "betterend:sulphuric_rock_stairs", + "betterend:sulphuric_rock_tiles", + "betterend:sulphuric_rock_wall", + "betterend:terminite_anvil", + "betterend:terminite_bars", + "betterend:terminite_block", + "betterend:terminite_bulb_lantern", + "betterend:terminite_bulb_lantern_black", + "betterend:terminite_bulb_lantern_blue", + "betterend:terminite_bulb_lantern_brown", + "betterend:terminite_bulb_lantern_cyan", + "betterend:terminite_bulb_lantern_gray", + "betterend:terminite_bulb_lantern_green", + "betterend:terminite_bulb_lantern_light_blue", + "betterend:terminite_bulb_lantern_light_gray", + "betterend:terminite_bulb_lantern_lime", + "betterend:terminite_bulb_lantern_magenta", + "betterend:terminite_bulb_lantern_orange", + "betterend:terminite_bulb_lantern_pink", + "betterend:terminite_bulb_lantern_purple", + "betterend:terminite_bulb_lantern_red", + "betterend:terminite_bulb_lantern_white", + "betterend:terminite_bulb_lantern_yellow", + "betterend:terminite_chain", + "betterend:terminite_chandelier", + "betterend:terminite_door", + "betterend:terminite_plate", + "betterend:terminite_slab", + "betterend:terminite_stairs", + "betterend:terminite_tile", + "betterend:terminite_trapdoor", + "betterend:thallasium_anvil", + "betterend:thallasium_bars", + "betterend:thallasium_block", + "betterend:thallasium_bulb_lantern", + "betterend:thallasium_bulb_lantern_black", + "betterend:thallasium_bulb_lantern_blue", + "betterend:thallasium_bulb_lantern_brown", + "betterend:thallasium_bulb_lantern_cyan", + "betterend:thallasium_bulb_lantern_gray", + "betterend:thallasium_bulb_lantern_green", + "betterend:thallasium_bulb_lantern_light_blue", + "betterend:thallasium_bulb_lantern_light_gray", + "betterend:thallasium_bulb_lantern_lime", + "betterend:thallasium_bulb_lantern_magenta", + "betterend:thallasium_bulb_lantern_orange", + "betterend:thallasium_bulb_lantern_pink", + "betterend:thallasium_bulb_lantern_purple", + "betterend:thallasium_bulb_lantern_red", + "betterend:thallasium_bulb_lantern_white", + "betterend:thallasium_bulb_lantern_yellow", + "betterend:thallasium_chain", + "betterend:thallasium_chandelier", + "betterend:thallasium_door", + "betterend:thallasium_ore", + "betterend:thallasium_plate", + "betterend:thallasium_slab", + "betterend:thallasium_stairs", + "betterend:thallasium_tile", + "betterend:thallasium_trapdoor", + "betterend:violecite", + "betterend:violecite_bricks", + "betterend:violecite_bricks_slab", + "betterend:violecite_bricks_stairs", + "betterend:violecite_bricks_wall", + "betterend:violecite_button", + "betterend:violecite_furnace", + "betterend:violecite_lantern", + "betterend:violecite_pedestal", + "betterend:violecite_pillar", + "betterend:violecite_plate", + "betterend:violecite_polished", + "betterend:violecite_slab", + "betterend:violecite_stairs", + "betterend:violecite_tiles", + "betterend:violecite_wall", + "betterend:virid_jadestone", + "betterend:virid_jadestone_bricks", + "betterend:virid_jadestone_bricks_slab", + "betterend:virid_jadestone_bricks_stairs", + "betterend:virid_jadestone_bricks_wall", + "betterend:virid_jadestone_button", + "betterend:virid_jadestone_furnace", + "betterend:virid_jadestone_lantern", + "betterend:virid_jadestone_pedestal", + "betterend:virid_jadestone_pillar", + "betterend:virid_jadestone_plate", + "betterend:virid_jadestone_polished", + "betterend:virid_jadestone_slab", + "betterend:virid_jadestone_stairs", + "betterend:virid_jadestone_tiles", + "betterend:virid_jadestone_wall", + + "betterend:amber_ore", + "betterend:end_stone_stalactite", + "betterend:end_stone_stalactite_cavemoss", + "betterend:ender_ore" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json b/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json new file mode 100644 index 00000000..31f7636d --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json @@ -0,0 +1,6 @@ +{ + "replace": "false", + "values": [ + "betterend:endstone_dust" + ] +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b880fc77..d19705e1 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -31,22 +31,20 @@ "ru.betterend.client.BetterEndClient" ], "rei_plugins": [ - "ru.betterend.integration.rei.REIPlugin" - ], - "rei_containers": [ - "ru.betterend.integration.rei.REIContainer" - ] + "ru.betterend.integration.rei.REIPlugin" + ] }, "mixins": [ "betterend.mixins.common.json", - "betterend.mixins.client.json" + "betterend.mixins.client.json", + "betterend.mixins.shadow.json" ], "depends": { - "fabricloader": ">=0.11.0", - "fabric": ">=0.32.0", - "minecraft": ">=1.16.4", - "bclib": ">=0.1.38" + "fabricloader": ">=0.11.6", + "fabric": ">=0.36.0", + "minecraft": ">=1.17", + "bclib": ">=0.2.0" }, "suggests": { "byg": ">=1.1.3",