From bdf3d0afb13075834af9ea9660f88986fa1d2858 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Mon, 9 Nov 2020 22:15:58 +0300 Subject: [PATCH] Infusion rituals --- .../ru/betterend/blocks/InfusionPedestal.java | 1 + .../entities/EternalPedestalEntity.java | 5 +++ .../entities/InfusionPedestalEntity.java | 10 ++++++ .../blocks/entities/PedestalBlockEntity.java | 5 +++ .../entities/render/PedestalItemRenderer.java | 4 +-- .../ru/betterend/recipe/InfusionRecipes.java | 2 ++ .../betterend/registry/EndBlockEntities.java | 8 +++-- .../registry/EndBlockEntityRenders.java | 2 ++ .../ru/betterend/rituals/InfusionRitual.java | 35 +++++++++++++++++++ 9 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 5df746c3..6b16e515 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -29,6 +29,7 @@ public class InfusionPedestal extends BlockPedestal { @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (world.isClient || !state.isOf(this)) return ActionResult.CONSUME; BlockEntity blockEntity = world.getBlockEntity(pos); InfusionPedestalEntity pedestal = null; if (blockEntity instanceof InfusionPedestalEntity) { diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 27f1132a..a17ca46e 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -4,11 +4,16 @@ import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +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 boolean hasRitual() { return this.linkedRitual != null; } diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index f6039c1e..ee85a5bc 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -4,12 +4,17 @@ import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; + public InfusionPedestalEntity() { + super(EndBlockEntities.INFUSION_PEDESTAL); + } + @Override public void setLocation(World world, BlockPos pos) { super.setLocation(world, pos); @@ -38,6 +43,11 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { super.tick(); } + @Override + public CompoundTag toInitialChunkDataTag() { + return this.toTag(new CompoundTag()); + } + @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 1e483554..7ccfb63e 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.entities; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; @@ -22,6 +23,10 @@ public class PedestalBlockEntity extends BlockEntity implements Inventory, Ticka super(EndBlockEntities.PEDESTAL); } + public PedestalBlockEntity(BlockEntityType type) { + super(type); + } + public int getAge() { return this.age; } diff --git a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java index e3dc9a03..c2ef2995 100644 --- a/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/blocks/entities/render/PedestalItemRenderer.java @@ -26,7 +26,7 @@ import ru.betterend.client.render.BeamRenderer; import ru.betterend.registry.EndBlocks; @Environment(EnvType.CLIENT) -public class PedestalItemRenderer extends BlockEntityRenderer { +public class PedestalItemRenderer extends BlockEntityRenderer { private static final Identifier BEAM_TEXTURE = new Identifier("textures/entity/end_gateway_beam.png"); public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { @@ -34,7 +34,7 @@ public class PedestalItemRenderer extends BlockEntityRenderer PEDESTAL = registerBlockEntity("pedestal", BlockEntityType.Builder.create(PedestalBlockEntity::new, getPedestals())); - public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", + public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", BlockEntityType.Builder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); - public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", + public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", BlockEntityType.Builder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); public static final BlockEntityType CHEST = registerBlockEntity("chest", BlockEntityType.Builder.create(EChestBlockEntity::new, getChests())); @@ -89,6 +91,8 @@ public class EndBlockEntities { EndItems.getModBlocks().forEach((item) -> { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); + if (block instanceof EternalPedestal || + block instanceof InfusionPedestal) return; if (block instanceof BlockPedestal) { result.add(block); } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java b/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java index e2b2f7e6..acb4c4f8 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntityRenders.java @@ -13,5 +13,7 @@ public class EndBlockEntityRenders { BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.CHEST, EndChestBlockEntityRenderer::new); BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.SIGN, EndSignBlockEntityRenderer::new); BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.PEDESTAL, PedestalItemRenderer::new); + BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.ETERNAL_PEDESTAL, PedestalItemRenderer::new); + BlockEntityRendererRegistry.INSTANCE.register(EndBlockEntities.INFUSION_PEDESTAL, PedestalItemRenderer::new); } } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 4fc0d54f..e067f3bf 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -7,10 +7,15 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; +import net.minecraft.particle.ItemStackParticleEffect; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.World; + import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.recipe.builders.InfusionRecipe; @@ -57,6 +62,20 @@ public class InfusionRitual implements Inventory { public boolean checkRecipe() { if (!isValid()) return false; + if (hasRecipe()) { + InfusionRecipe recipe = this.world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); + if (recipe == null) { + this.activeRecipe = null; + this.progress = 0; + this.time = 0; + return false; + } else if (recipe != activeRecipe) { + this.activeRecipe = recipe; + this.time = this.activeRecipe.getInfusionTime(); + this.progress = 0; + } + return true; + } this.activeRecipe = this.world.getRecipeManager().getFirstMatch(InfusionRecipe.TYPE, this, world).orElse(null); if (activeRecipe != null) { this.time = this.activeRecipe.getInfusionTime(); @@ -68,6 +87,7 @@ public class InfusionRitual implements Inventory { public void tick() { if (!isValid() || !hasRecipe()) return; + if (!checkRecipe()) return; this.progress++; if (progress == time) { BlockState inputState = world.getBlockState(input.getPos()); @@ -79,7 +99,22 @@ public class InfusionRitual implements Inventory { this.activeRecipe = null; this.progress = 0; this.time = 0; + } else { + ServerWorld world = (ServerWorld) this.world; + BlockPos target = this.worldPos.up(); + double tx = target.getX() + 0.5; + double ty = target.getY() + 1.75; + double tz = target.getZ() + 0.5; + for (PedestalBlockEntity catalyst : catalysts) { + BlockPos start = catalyst.getPos().up(); + double sx = start.getX() + 0.5; + double sy = start.getY() + 0.25; + double sz = start.getZ() + 0.5; + ItemStackParticleEffect catalystParticle = new ItemStackParticleEffect(ParticleTypes.ITEM, catalyst.getStack(0)); + world.spawnParticles(catalystParticle, sx, sy, sz, 0, tx - sx, ty - sy, tz - sz, 0.125); + } } + } @Override