fix being able to place covers on connected cables

This commit is contained in:
Darkere
2021-10-31 13:16:23 +01:00
parent 2a27275ba3
commit 110b8ea9b1
2 changed files with 33 additions and 17 deletions

View File

@@ -2,14 +2,11 @@ package com.refinedmods.refinedstorage.block;
import com.refinedmods.refinedstorage.api.network.node.ICoverable; import com.refinedmods.refinedstorage.api.network.node.ICoverable;
import com.refinedmods.refinedstorage.api.network.node.INetworkNodeProxy; import com.refinedmods.refinedstorage.api.network.node.INetworkNodeProxy;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.Cover;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverType; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverType;
import com.refinedmods.refinedstorage.block.shape.ShapeCache; import com.refinedmods.refinedstorage.block.shape.ShapeCache;
import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability; import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability;
import com.refinedmods.refinedstorage.render.ConstantsCable; import com.refinedmods.refinedstorage.render.ConstantsCable;
import com.refinedmods.refinedstorage.tile.CableTile; import com.refinedmods.refinedstorage.tile.CableTile;
import com.refinedmods.refinedstorage.tile.NetworkNodeTile;
import com.refinedmods.refinedstorage.util.BlockUtils; import com.refinedmods.refinedstorage.util.BlockUtils;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@@ -169,20 +166,20 @@ public class CableBlock extends NetworkNodeBlock implements IWaterLoggable {
} }
return tile.getCapability(NetworkNodeProxyCapability.NETWORK_NODE_PROXY_CAPABILITY, direction).isPresent() return tile.getCapability(NetworkNodeProxyCapability.NETWORK_NODE_PROXY_CAPABILITY, direction).isPresent()
&& isSideNotCoveredOrHollow(tile, direction) && isSideNotCoveredOrHollow(tile, direction)
&& isSideNotCoveredOrHollow(world.getTileEntity(pos.offset(direction)), direction.getOpposite()); && isSideNotCoveredOrHollow(world.getTileEntity(pos.offset(direction)), direction.getOpposite());
} }
private boolean isSideNotCoveredOrHollow(TileEntity tile, Direction direction){ private boolean isSideNotCoveredOrHollow(TileEntity tile, Direction direction) {
if (tile == null){ if (tile == null) {
return false; return false;
} }
return tile.getCapability(NetworkNodeProxyCapability.NETWORK_NODE_PROXY_CAPABILITY, direction) return tile.getCapability(NetworkNodeProxyCapability.NETWORK_NODE_PROXY_CAPABILITY, direction)
.map(INetworkNodeProxy::getNode) .map(INetworkNodeProxy::getNode)
.map(iNetworkNode -> !(iNetworkNode instanceof ICoverable) .map(iNetworkNode -> !(iNetworkNode instanceof ICoverable)
|| (!((ICoverable) iNetworkNode).getCoverManager().hasCover(direction) || (!((ICoverable) iNetworkNode).getCoverManager().hasCover(direction)
|| ((ICoverable) iNetworkNode).getCoverManager().getCover(direction).getType() == CoverType.HOLLOW)) || ((ICoverable) iNetworkNode).getCoverManager().getCover(direction).getType() == CoverType.HOLLOW))
.orElse(false); .orElse(false);
} }
private BlockState getState(BlockState currentState, IWorld world, BlockPos pos) { private BlockState getState(BlockState currentState, IWorld world, BlockPos pos) {
@@ -214,4 +211,22 @@ public class CableBlock extends NetworkNodeBlock implements IWaterLoggable {
builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, WATERLOGGED); builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, WATERLOGGED);
} }
public static boolean hasVisualConnectionOnSide(BlockState state, Direction direction) {
switch (direction) {
case DOWN:
return state.get(DOWN);
case UP:
return state.get(UP);
case NORTH:
return state.get(NORTH);
case SOUTH:
return state.get(SOUTH);
case WEST:
return state.get(WEST);
case EAST:
return state.get(EAST);
}
return false;
}
} }

View File

@@ -8,6 +8,7 @@ import com.refinedmods.refinedstorage.apiimpl.API;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.Cover; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.Cover;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverType; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverType;
import com.refinedmods.refinedstorage.block.CableBlock;
import com.refinedmods.refinedstorage.tile.NetworkNodeTile; import com.refinedmods.refinedstorage.tile.NetworkNodeTile;
import com.refinedmods.refinedstorage.util.WorldUtils; import com.refinedmods.refinedstorage.util.WorldUtils;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@@ -67,7 +68,7 @@ public class CoverItem extends Item {
ItemStack item = getItem(stack); ItemStack item = getItem(stack);
if (!item.isEmpty()) { if (!item.isEmpty()) {
tooltip.add(((TextComponent)item.getItem().getDisplayName(item)).mergeStyle(TextFormatting.GRAY)); tooltip.add(((TextComponent) item.getItem().getDisplayName(item)).mergeStyle(TextFormatting.GRAY));
} }
} }
@@ -118,7 +119,7 @@ public class CoverItem extends Item {
TileEntity tile = world.getTileEntity(pos); TileEntity tile = world.getTileEntity(pos);
// Support placing on the bottom side without too much hassle. // Support placing on the bottom side without too much hassle.
if (!canPlaceOn(tile)) { if (!canPlaceOn(world, pos, facing)) {
pos = pos.up(); pos = pos.up();
facing = Direction.DOWN; facing = Direction.DOWN;
@@ -126,7 +127,7 @@ public class CoverItem extends Item {
tile = world.getTileEntity(pos); tile = world.getTileEntity(pos);
} }
if (canPlaceOn(tile)) { if (canPlaceOn(world, pos, facing)) {
if (world.isRemote) { if (world.isRemote) {
ModelDataManager.requestModelDataRefresh(tile); ModelDataManager.requestModelDataRefresh(tile);
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
@@ -155,8 +156,8 @@ public class CoverItem extends Item {
} }
private boolean canPlaceOn(TileEntity tile) { private boolean canPlaceOn(World world, BlockPos pos, Direction facing) {
return tile instanceof NetworkNodeTile && ((NetworkNodeTile<?>) tile).getNode() instanceof ICoverable; return world.getTileEntity(pos) instanceof NetworkNodeTile && ((NetworkNodeTile<?>) world.getTileEntity(pos)).getNode() instanceof ICoverable && !CableBlock.hasVisualConnectionOnSide(world.getBlockState(pos), facing);
} }
protected Cover createCover(ItemStack stack) { protected Cover createCover(ItemStack stack) {