Skip to content

Commit

Permalink
rework drone redstone emission significantly
Browse files Browse the repository at this point in the history
  • Loading branch information
desht committed Apr 21, 2024
1 parent bc8854c commit dea19f1
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 26 deletions.
2 changes: 2 additions & 0 deletions src/api/java/me/desht/pneumaticcraft/api/drone/IDrone.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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));
}
Expand All @@ -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<DroneEntity> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Direction,Integer> 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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,7 @@ public void setEmittingRedstone(Direction orientation, int emittingRedstone) {
updateNeighbours();
}

@Override
public int getEmittingRedstone(Direction direction) {
return redstoneLevels[direction.get3DDataValue()];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -1235,6 +1237,7 @@ public IItemHandlerModifiable getInv() {
return droneItemHandler;
}

@Override
public int getEmittingRedstone(Direction side) {
return emittingRedstoneValues.getOrDefault(side, 0);
}
Expand Down

0 comments on commit dea19f1

Please sign in to comment.