From 2675d6ae2f3c8607053a5460910bff7d253a50fe Mon Sep 17 00:00:00 2001 From: LordGrimmauld Date: Sun, 9 Aug 2020 13:32:08 +0200 Subject: [PATCH] Campfire movement behaviour - Campfire now spawns smoke when moved --- .../create/AllMovementBehaviours.java | 18 ++++++--- .../actors/CampfireMovementBehaviour.java | 37 +++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java diff --git a/src/main/java/com/simibubi/create/AllMovementBehaviours.java b/src/main/java/com/simibubi/create/AllMovementBehaviours.java index 296ae2f6d..5032ace15 100644 --- a/src/main/java/com/simibubi/create/AllMovementBehaviours.java +++ b/src/main/java/com/simibubi/create/AllMovementBehaviours.java @@ -1,22 +1,29 @@ package com.simibubi.create; +import java.util.HashMap; + +import javax.annotation.Nullable; + import com.simibubi.create.content.contraptions.components.actors.BellMovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.CampfireMovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.tterrag.registrate.util.nullness.NonNullConsumer; + import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.util.ResourceLocation; -import javax.annotation.Nullable; -import java.util.HashMap; - public class AllMovementBehaviours { private static final HashMap movementBehaviours = new HashMap<>(); - public static void addMovementBehaviour(ResourceLocation resourceLocation, MovementBehaviour movementBehaviour) { + private static void addMovementBehaviour(ResourceLocation resourceLocation, MovementBehaviour movementBehaviour) { movementBehaviours.put(resourceLocation, movementBehaviour); } + public static void addMovementBehaviour(Block block, MovementBehaviour movementBehaviour) { + addMovementBehaviour(block.getRegistryName(), movementBehaviour); + } + @Nullable public static MovementBehaviour getMovementBehaviour(ResourceLocation resourceLocation) { return movementBehaviours.getOrDefault(resourceLocation, null); @@ -37,6 +44,7 @@ public class AllMovementBehaviours { } static void register() { - addMovementBehaviour(Blocks.BELL.getRegistryName(), new BellMovementBehaviour()); + addMovementBehaviour(Blocks.BELL, new BellMovementBehaviour()); + addMovementBehaviour(Blocks.CAMPFIRE, new CampfireMovementBehaviour()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java new file mode 100644 index 000000000..a1f1c148f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/CampfireMovementBehaviour.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import java.util.Random; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; + +import net.minecraft.block.CampfireBlock; +import net.minecraft.particles.ParticleTypes; + +public class CampfireMovementBehaviour extends MovementBehaviour { + @Override + public boolean hasSpecialMovementRenderer() { + return false; + } + + @Override + public void tick(MovementContext context) { + if (context.world == null || !context.world.isRemote || context.position == null + || !context.state.get(CampfireBlock.LIT)) + return; + + // Mostly copied from CampfireBlock and CampfireTileEntity + Random random = context.world.rand; + if (random.nextFloat() < 0.11F) { + for (int i = 0; i < random.nextInt(2) + 2; ++i) { + context.world.addOptionalParticle( + context.state.get(CampfireBlock.SIGNAL_FIRE) ? ParticleTypes.CAMPFIRE_SIGNAL_SMOKE + : ParticleTypes.CAMPFIRE_COSY_SMOKE, + true, context.position.getX() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), + context.position.getY() + random.nextDouble() + random.nextDouble(), + context.position.getZ() + random.nextDouble() / (random.nextBoolean() ? 3D : -3D), 0.0D, 0.07D, + 0.0D); + } + } + } +}