From dea19f128fca76271c92af52d05b8684f7bc66ce Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Sun, 21 Apr 2024 12:15:48 +0100 Subject: [PATCH] rework drone redstone emission significantly #1297 --- .../pneumaticcraft/api/drone/IDrone.java | 2 + .../block/DroneRedstoneEmitterBlock.java | 16 ++----- .../DroneRedstoneEmitterBlockEntity.java | 47 +++++++++++++++---- .../ProgrammableControllerBlockEntity.java | 1 + .../common/entity/drone/DroneEntity.java | 13 +++-- 5 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/api/java/me/desht/pneumaticcraft/api/drone/IDrone.java b/src/api/java/me/desht/pneumaticcraft/api/drone/IDrone.java index 0e9a4551c..ca8e48017 100644 --- a/src/api/java/me/desht/pneumaticcraft/api/drone/IDrone.java +++ b/src/api/java/me/desht/pneumaticcraft/api/drone/IDrone.java @@ -154,6 +154,8 @@ public interface IDrone extends ICapabilityProvider { */ void setEmittingRedstone(Direction orientation, int emittingRedstone); + int getEmittingRedstone(Direction orientation); + /** * Set the drone's custom name. * diff --git a/src/main/java/me/desht/pneumaticcraft/common/block/DroneRedstoneEmitterBlock.java b/src/main/java/me/desht/pneumaticcraft/common/block/DroneRedstoneEmitterBlock.java index 037644ae6..ae7353885 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/block/DroneRedstoneEmitterBlock.java +++ b/src/main/java/me/desht/pneumaticcraft/common/block/DroneRedstoneEmitterBlock.java @@ -19,6 +19,7 @@ import me.desht.pneumaticcraft.common.block.entity.DroneRedstoneEmitterBlockEntity; import me.desht.pneumaticcraft.common.entity.drone.DroneEntity; +import me.desht.pneumaticcraft.common.util.PneumaticCraftUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; @@ -34,7 +35,7 @@ import javax.annotation.Nullable; import java.util.List; -public class DroneRedstoneEmitterBlock extends AirBlock implements EntityBlock { +public class DroneRedstoneEmitterBlock extends AirBlock implements PneumaticCraftEntityBlock { public DroneRedstoneEmitterBlock() { super(Block.Properties.copy(Blocks.AIR)); } @@ -51,16 +52,9 @@ public int getDirectSignal(BlockState state, BlockGetter par1IBlockAccess, Block @Override public int getSignal(BlockState state, BlockGetter blockAccess, BlockPos pos, Direction side) { - if (blockAccess instanceof EntityGetter entityGetter) { - List drones = entityGetter.getEntitiesOfClass(DroneEntity.class, new AABB(pos, pos.offset(1, 1, 1))); - int signal = 0; - for (DroneEntity drone : drones) { - signal = Math.max(signal, drone.getEmittingRedstone(side.getOpposite())); - } - return signal; - } else { - return 0; - } + return PneumaticCraftUtils.getTileEntityAt(blockAccess, pos, DroneRedstoneEmitterBlockEntity.class) + .map(be -> be.getSignalLevel(side)) + .orElse(0); } @Nullable diff --git a/src/main/java/me/desht/pneumaticcraft/common/block/entity/DroneRedstoneEmitterBlockEntity.java b/src/main/java/me/desht/pneumaticcraft/common/block/entity/DroneRedstoneEmitterBlockEntity.java index 52219f832..7bd271010 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/block/entity/DroneRedstoneEmitterBlockEntity.java +++ b/src/main/java/me/desht/pneumaticcraft/common/block/entity/DroneRedstoneEmitterBlockEntity.java @@ -18,32 +18,59 @@ package me.desht.pneumaticcraft.common.block.entity; import me.desht.pneumaticcraft.common.core.ModBlockEntities; +import me.desht.pneumaticcraft.common.drone.IDroneBase; import me.desht.pneumaticcraft.common.util.DirectionUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.IItemHandler; +import java.util.EnumMap; +import java.util.Map; + public class DroneRedstoneEmitterBlockEntity extends AbstractTickingBlockEntity { + private IDroneBase owner; + private final Map signalLevels = new EnumMap<>(Direction.class); + public DroneRedstoneEmitterBlockEntity(BlockPos pos, BlockState state) { super(ModBlockEntities.DRONE_REDSTONE_EMITTER.get(), pos, state); } + public void setOwner(IDroneBase owner) { + this.owner = owner; + } + @Override - public void tickServer() { - // note: not calling super() - don't need default server tick logic + public IItemHandler getPrimaryInventory() { + return null; + } - BlockState state = nonNullLevel().getBlockState(getBlockPos()); - for (Direction facing : DirectionUtil.VALUES) { - if (state.getSignal(nonNullLevel(), getBlockPos(), facing) > 0) { - return; + @Override + public void tickServer() { + if (owner == null || !owner.isDroneStillValid()) { + nonNullLevel().removeBlock(getBlockPos(), false); + } else { + boolean changed = false; + signalLevels.clear(); + for (Direction facing : DirectionUtil.VALUES) { + int signal = owner.getEmittingRedstone(facing); + if (signal != signalLevels.getOrDefault(facing, 0)) { + changed = true; + } + if (signal > 0) { + signalLevels.put(facing, signal); + } + } + if (signalLevels.isEmpty()) { + nonNullLevel().removeBlock(getBlockPos(), false); + } else if (changed) { + updateNeighbours(); } } - nonNullLevel().removeBlock(getBlockPos(), false); } - @Override - public IItemHandler getPrimaryInventory() { - return null; + public int getSignalLevel(Direction side) { + return owner == null || !owner.isDroneStillValid() ? 0 : signalLevels.getOrDefault(side.getOpposite(), 0); } + } diff --git a/src/main/java/me/desht/pneumaticcraft/common/block/entity/ProgrammableControllerBlockEntity.java b/src/main/java/me/desht/pneumaticcraft/common/block/entity/ProgrammableControllerBlockEntity.java index d881f060d..21d6b6aa0 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/block/entity/ProgrammableControllerBlockEntity.java +++ b/src/main/java/me/desht/pneumaticcraft/common/block/entity/ProgrammableControllerBlockEntity.java @@ -676,6 +676,7 @@ public void setEmittingRedstone(Direction orientation, int emittingRedstone) { updateNeighbours(); } + @Override public int getEmittingRedstone(Direction direction) { return redstoneLevels[direction.get3DDataValue()]; } diff --git a/src/main/java/me/desht/pneumaticcraft/common/entity/drone/DroneEntity.java b/src/main/java/me/desht/pneumaticcraft/common/entity/drone/DroneEntity.java index c43f822c2..ebe815d41 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/entity/drone/DroneEntity.java +++ b/src/main/java/me/desht/pneumaticcraft/common/entity/drone/DroneEntity.java @@ -33,6 +33,7 @@ import me.desht.pneumaticcraft.api.tileentity.IManoMeasurable; import me.desht.pneumaticcraft.api.upgrade.PNCUpgrade; import me.desht.pneumaticcraft.client.util.ProgressingLine; +import me.desht.pneumaticcraft.common.block.entity.DroneRedstoneEmitterBlockEntity; import me.desht.pneumaticcraft.common.block.entity.PneumaticEnergyStorage; import me.desht.pneumaticcraft.common.block.entity.ProgrammerBlockEntity; import me.desht.pneumaticcraft.common.capabilities.BasicAirHandler; @@ -575,11 +576,12 @@ private void onFirstTick() { } private void handleRedstoneEmission() { - for (Direction d : DirectionUtil.VALUES) { - if (getEmittingRedstone(d) > 0) { - BlockPos emitterPos = new BlockPos((int) Math.floor(getX() + getBbWidth() / 2), (int) Math.floor(getY()), (int) Math.floor(getZ() + getBbWidth() / 2)); - if (level().isEmptyBlock(emitterPos)) { - level().setBlockAndUpdate(emitterPos, ModBlocks.DRONE_REDSTONE_EMITTER.get().defaultBlockState()); + if (level().isEmptyBlock(blockPosition())) { + for (Direction d : DirectionUtil.VALUES) { + if (getEmittingRedstone(d) > 0) { + level().setBlockAndUpdate(blockPosition(), ModBlocks.DRONE_REDSTONE_EMITTER.get().defaultBlockState()); + PneumaticCraftUtils.getTileEntityAt(level(), blockPosition(), DroneRedstoneEmitterBlockEntity.class) + .ifPresent(be -> be.setOwner(this)); } break; } @@ -1235,6 +1237,7 @@ public IItemHandlerModifiable getInv() { return droneItemHandler; } + @Override public int getEmittingRedstone(Direction side) { return emittingRedstoneValues.getOrDefault(side, 0); }