Improve CoverType to not needlessly store large hollow cover types.

This commit is contained in:
raoulvdberge
2018-07-09 21:36:25 +02:00
parent c38e48b6bd
commit f55faf3517
14 changed files with 85 additions and 94 deletions

View File

@@ -16,7 +16,7 @@ public class NetworkNodeCable extends NetworkNode implements ICoverable {
private static final String NBT_COVERS = "Covers";
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.ANY);
private CoverManager coverManager = new CoverManager(this);
public NetworkNodeCable(World world, BlockPos pos) {
super(world, pos);

View File

@@ -67,7 +67,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable,
private int type = IType.ITEMS;
private boolean drop = false;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_LARGE_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
public NetworkNodeConstructor(World world, BlockPos pos) {
super(world, pos);

View File

@@ -73,7 +73,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I
private int type = IType.ITEMS;
private boolean pickupItem = false;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_LARGE_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
public NetworkNodeDestructor(World world, BlockPos pos) {
super(world, pos);

View File

@@ -44,7 +44,7 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy
private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE;
private int type = IType.ITEMS;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
private int filterSlot;

View File

@@ -56,7 +56,7 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
private AccessType accessType = AccessType.INSERT_EXTRACT;
private int networkTicks;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_MEDIUM_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
private List<IStorageExternal<ItemStack>> itemStorages = new CopyOnWriteArrayList<>();
private List<IStorageExternal<FluidStack>> fluidStorages = new CopyOnWriteArrayList<>();

View File

@@ -49,7 +49,7 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IFi
private int mode = IFilterable.BLACKLIST;
private int type = IType.ITEMS;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_MEDIUM_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
private int currentSlot;

View File

@@ -21,7 +21,7 @@ public class NetworkNodeReader extends NetworkNode implements IReader, IGuiReade
private String channel = "";
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_LARGE_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
public NetworkNodeReader(World world, BlockPos pos) {
super(world, pos);

View File

@@ -27,7 +27,7 @@ public class NetworkNodeWriter extends NetworkNode implements IWriter, IGuiReade
private int redstoneStrength;
private int lastRedstoneStrength;
private CoverManager coverManager = new CoverManager(this, CoverManager.CoverPlacementMode.HOLLOW_LARGE_ON_FACE);
private CoverManager coverManager = new CoverManager(this);
public NetworkNodeWriter(World world, BlockPos pos) {
super(world, pos);

View File

@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCable;
import com.raoulvdberge.refinedstorage.item.ItemCover;
import net.minecraft.block.Block;
import net.minecraft.block.BlockGlass;
@@ -24,29 +25,20 @@ import java.util.HashMap;
import java.util.Map;
public class CoverManager {
public enum CoverPlacementMode {
ANY,
HOLLOW_ON_FACE,
HOLLOW_MEDIUM_ON_FACE,
HOLLOW_LARGE_ON_FACE
}
private static final String NBT_DIRECTION = "Direction";
private static final String NBT_ITEM = "Item";
private static final String NBT_TYPE = "Type";
private Map<EnumFacing, Cover> covers = new HashMap<>();
private NetworkNode node;
private CoverPlacementMode placementMode;
public CoverManager(NetworkNode node, CoverPlacementMode placementMode) {
public CoverManager(NetworkNode node) {
this.node = node;
this.placementMode = placementMode;
}
public boolean canConduct(EnumFacing direction) {
Cover cover = getCover(direction);
if (cover != null && !cover.getType().isHollow()) {
if (cover != null && cover.getType() != CoverType.HOLLOW) {
return false;
}
@@ -54,7 +46,7 @@ public class CoverManager {
if (neighbor instanceof ICoverable) {
cover = ((ICoverable) neighbor).getCoverManager().getCover(direction.getOpposite());
if (cover != null && !cover.getType().isHollow()) {
if (cover != null && cover.getType() != CoverType.HOLLOW) {
return false;
}
}
@@ -73,19 +65,8 @@ public class CoverManager {
public boolean setCover(EnumFacing facing, Cover cover) {
if (isValidCover(cover.getStack()) && !hasCover(facing)) {
if (facing == node.getDirection()) {
switch (placementMode) {
case ANY:
break;
case HOLLOW_ON_FACE:
case HOLLOW_MEDIUM_ON_FACE:
case HOLLOW_LARGE_ON_FACE:
if (!cover.getType().isHollow()) {
return false;
}
cover = new Cover(cover.getStack(), placementMode == CoverPlacementMode.HOLLOW_ON_FACE ? CoverType.HOLLOW : (placementMode == CoverPlacementMode.HOLLOW_MEDIUM_ON_FACE ? CoverType.HOLLOW_MEDIUM : CoverType.HOLLOW_LARGE));
break;
}
if (facing == node.getDirection() && !(node instanceof NetworkNodeCable) && cover.getType() != CoverType.HOLLOW) {
return false;
}
covers.put(facing, cover);

View File

@@ -5,13 +5,7 @@ import net.minecraft.item.ItemStack;
public enum CoverType {
NORMAL,
HOLLOW,
HOLLOW_MEDIUM,
HOLLOW_LARGE;
public boolean isHollow() {
return this == HOLLOW || this == HOLLOW_MEDIUM || this == HOLLOW_LARGE;
}
HOLLOW;
public ItemStack createStack() {
return new ItemStack(this == NORMAL ? RSItems.COVER : RSItems.HOLLOW_COVER);

View File

@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.ICoverable;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.Cover;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverType;
import com.raoulvdberge.refinedstorage.block.info.BlockInfoBuilder;
import com.raoulvdberge.refinedstorage.block.info.IBlockInfo;
import com.raoulvdberge.refinedstorage.block.property.PropertyObject;
@@ -149,7 +150,7 @@ public class BlockCable extends BlockNode {
if (node instanceof ICoverable) {
Cover cover = ((ICoverable) node).getCoverManager().getCover(direction);
if (cover != null && !cover.getType().isHollow()) {
if (cover != null && cover.getType() != CoverType.HOLLOW) {
return false;
}
}
@@ -159,7 +160,7 @@ public class BlockCable extends BlockNode {
if (otherTile instanceof TileNode && ((TileNode) otherTile).getNode() instanceof ICoverable) {
Cover cover = ((ICoverable) ((TileNode) otherTile).getNode()).getCoverManager().getCover(direction.getOpposite());
if (cover != null && !cover.getType().isHollow()) {
if (cover != null && cover.getType() != CoverType.HOLLOW) {
return false;
}
}
@@ -244,7 +245,7 @@ public class BlockCable extends BlockNode {
coverEast != null ? 14 : 16, coverUp != null ? 14 : 16, 2
)));
if (!coverNorth.getType().isHollow()) {
if (coverNorth.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_NORTH);
}
}
@@ -255,7 +256,7 @@ public class BlockCable extends BlockNode {
16, coverUp != null ? 14 : 16, 16
)));
if (!coverEast.getType().isHollow()) {
if (coverEast.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_EAST);
}
}
@@ -266,7 +267,7 @@ public class BlockCable extends BlockNode {
coverWest != null ? 2 : 0, coverUp != null ? 14 : 16, 14
)));
if (!coverSouth.getType().isHollow()) {
if (coverSouth.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_SOUTH);
}
}
@@ -277,7 +278,7 @@ public class BlockCable extends BlockNode {
2, coverUp != null ? 14 : 16, 16
)));
if (!coverWest.getType().isHollow()) {
if (coverWest.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_WEST);
}
}
@@ -288,7 +289,7 @@ public class BlockCable extends BlockNode {
16, 16, 16
)));
if (!coverUp.getType().isHollow()) {
if (coverUp.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_UP);
}
}
@@ -299,7 +300,7 @@ public class BlockCable extends BlockNode {
16, 2, 16
)));
if (!coverDown.getType().isHollow()) {
if (coverDown.getType() != CoverType.HOLLOW) {
groups.add(ConstantsCable.HOLDER_DOWN);
}
}

View File

@@ -1,19 +1,20 @@
package com.raoulvdberge.refinedstorage.render.collision.constants;
import com.raoulvdberge.refinedstorage.render.collision.CollisionGroup;
import com.raoulvdberge.refinedstorage.util.CollisionUtils;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import javax.annotation.Nonnull;
public final class ConstantsCable {
public static final CollisionGroup CORE = new CollisionGroup().addItem(getBounds(6, 6, 6, 10, 10, 10));
public static final CollisionGroup NORTH = new CollisionGroup().addItem(getBounds(6, 6, 0, 10, 10, 6));
public static final CollisionGroup EAST = new CollisionGroup().addItem(getBounds(10, 6, 6, 16, 10, 10));
public static final CollisionGroup SOUTH = new CollisionGroup().addItem(getBounds(6, 6, 10, 10, 10, 16));
public static final CollisionGroup WEST = new CollisionGroup().addItem(getBounds(0, 6, 6, 6, 10, 10));
public static final CollisionGroup UP = new CollisionGroup().addItem(getBounds(6, 10, 6, 10, 16, 10));
public static final CollisionGroup DOWN = new CollisionGroup().addItem(getBounds(6, 0, 6, 10, 6, 10));
public static final CollisionGroup CORE = new CollisionGroup().addItem(CollisionUtils.getBounds(6, 6, 6, 10, 10, 10));
public static final CollisionGroup NORTH = new CollisionGroup().addItem(CollisionUtils.getBounds(6, 6, 0, 10, 10, 6));
public static final CollisionGroup EAST = new CollisionGroup().addItem(CollisionUtils.getBounds(10, 6, 6, 16, 10, 10));
public static final CollisionGroup SOUTH = new CollisionGroup().addItem(CollisionUtils.getBounds(6, 6, 10, 10, 10, 16));
public static final CollisionGroup WEST = new CollisionGroup().addItem(CollisionUtils.getBounds(0, 6, 6, 6, 10, 10));
public static final CollisionGroup UP = new CollisionGroup().addItem(CollisionUtils.getBounds(6, 10, 6, 10, 16, 10));
public static final CollisionGroup DOWN = new CollisionGroup().addItem(CollisionUtils.getBounds(6, 0, 6, 10, 6, 10));
public static final CollisionGroup HOLDER_NORTH = new CollisionGroup().addItem(getHolderBounds(EnumFacing.NORTH));
public static final CollisionGroup HOLDER_EAST = new CollisionGroup().addItem(getHolderBounds(EnumFacing.EAST));
@@ -22,26 +23,21 @@ public final class ConstantsCable {
public static final CollisionGroup HOLDER_UP = new CollisionGroup().addItem(getHolderBounds(EnumFacing.UP));
public static final CollisionGroup HOLDER_DOWN = new CollisionGroup().addItem(getHolderBounds(EnumFacing.DOWN));
public static AxisAlignedBB getBounds(int fromX, int fromY, int fromZ, int toX, int toY, int toZ) {
return new AxisAlignedBB((float) fromX / 16F, (float) fromY / 16F, (float) fromZ / 16F, (float) toX / 16F, (float) toY / 16F, (float) toZ / 16F);
}
@Nonnull
public static AxisAlignedBB getCoverBounds(EnumFacing side) {
switch (side) {
case DOWN:
return getBounds(0, 0, 0, 16, 2, 16);
return CollisionUtils.getBounds(0, 0, 0, 16, 2, 16);
case UP:
return getBounds(0, 14, 0, 16, 16, 16);
return CollisionUtils.getBounds(0, 14, 0, 16, 16, 16);
case NORTH:
return getBounds(0, 0, 0, 16, 16, 2);
return CollisionUtils.getBounds(0, 0, 0, 16, 16, 2);
case SOUTH:
return getBounds(0, 0, 14, 16, 16, 16);
return CollisionUtils.getBounds(0, 0, 14, 16, 16, 16);
case WEST:
return getBounds(0, 0, 0, 2, 16, 16);
return CollisionUtils.getBounds(0, 0, 0, 2, 16, 16);
case EAST:
return getBounds(14, 0, 0, 16, 16, 16);
return CollisionUtils.getBounds(14, 0, 0, 16, 16, 16);
default:
return null;
}
@@ -51,17 +47,17 @@ public final class ConstantsCable {
public static AxisAlignedBB getHolderBounds(EnumFacing side) {
switch (side) {
case DOWN:
return getBounds(7, 2, 7, 9, 6, 9);
return CollisionUtils.getBounds(7, 2, 7, 9, 6, 9);
case UP:
return getBounds(7, 10, 7, 9, 14, 9);
return CollisionUtils.getBounds(7, 10, 7, 9, 14, 9);
case NORTH:
return getBounds(7, 7, 2, 9, 9, 6);
return CollisionUtils.getBounds(7, 7, 2, 9, 9, 6);
case SOUTH:
return getBounds(7, 7, 10, 9, 9, 14);
return CollisionUtils.getBounds(7, 7, 10, 9, 9, 14);
case WEST:
return getBounds(2, 7, 7, 6, 9, 9);
return CollisionUtils.getBounds(2, 7, 7, 6, 9, 9);
case EAST:
return getBounds(10, 7, 7, 14, 9, 9);
return CollisionUtils.getBounds(10, 7, 7, 14, 9, 9);
default:
return null;
}

View File

@@ -1,8 +1,10 @@
package com.raoulvdberge.refinedstorage.render.model.baked;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSBlocks;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.Cover;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager;
import com.raoulvdberge.refinedstorage.block.BlockBase;
import com.raoulvdberge.refinedstorage.block.BlockCable;
import com.raoulvdberge.refinedstorage.render.CubeBuilder;
import com.raoulvdberge.refinedstorage.render.collision.constants.ConstantsCable;
@@ -39,26 +41,40 @@ public class BakedModelCableCover implements IBakedModel {
List<BakedQuad> quads = new ArrayList<>(base.getQuads(state, side, rand));
if (state != null) {
IExtendedBlockState s = (IExtendedBlockState) state;
IExtendedBlockState extendedState = (IExtendedBlockState) state;
boolean hasUp = s.getValue(BlockCable.COVER_UP) != null;
boolean hasDown = s.getValue(BlockCable.COVER_DOWN) != null;
boolean hasEast = s.getValue(BlockCable.COVER_EAST) != null;
boolean hasWest = s.getValue(BlockCable.COVER_WEST) != null;
addCover(quads, s.getValue(BlockCable.COVER_NORTH), EnumFacing.NORTH, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, s.getValue(BlockCable.COVER_SOUTH), EnumFacing.SOUTH, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, s.getValue(BlockCable.COVER_EAST), EnumFacing.EAST, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, s.getValue(BlockCable.COVER_WEST), EnumFacing.WEST, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, s.getValue(BlockCable.COVER_DOWN), EnumFacing.DOWN, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, s.getValue(BlockCable.COVER_UP), EnumFacing.UP, side, rand, hasUp, hasDown, hasEast, hasWest, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_NORTH), EnumFacing.NORTH, side, rand, extendedState, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_SOUTH), EnumFacing.SOUTH, side, rand, extendedState, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_EAST), EnumFacing.EAST, side, rand, extendedState, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_WEST), EnumFacing.WEST, side, rand, extendedState, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_DOWN), EnumFacing.DOWN, side, rand, extendedState, true);
addCover(quads, extendedState.getValue(BlockCable.COVER_UP), EnumFacing.UP, side, rand, extendedState, true);
}
return quads;
}
protected static void addCover(List<BakedQuad> quads, @Nullable Cover cover, EnumFacing coverSide, EnumFacing side, long rand, boolean hasUp, boolean hasDown, boolean hasEast, boolean hasWest, boolean handle) {
private static int getHollowCoverSize(@Nullable IBlockState state, EnumFacing coverSide) {
if (state == null) {
return 6;
}
BlockBase block = (BlockBase) state.getBlock();
if (block.getDirection() != null && state.getValue(block.getDirection().getProperty()) == coverSide) {
if (block == RSBlocks.CABLE || block == RSBlocks.EXPORTER) {
return 6;
} else if (block == RSBlocks.EXTERNAL_STORAGE || block == RSBlocks.IMPORTER) {
return 3;
} else if (block == RSBlocks.CONSTRUCTOR || block == RSBlocks.DESTRUCTOR || block == RSBlocks.READER || block == RSBlocks.WRITER) {
return 2;
}
}
return 6;
}
protected static void addCover(List<BakedQuad> quads, @Nullable Cover cover, EnumFacing coverSide, EnumFacing side, long rand, @Nullable IExtendedBlockState state, boolean handle) {
if (cover == null) {
return;
}
@@ -69,6 +85,15 @@ public class BakedModelCableCover implements IBakedModel {
return;
}
boolean hasUp = false, hasDown = false, hasEast = false, hasWest = false;
if (state != null) {
hasUp = state.getValue(BlockCable.COVER_UP) != null;
hasDown = state.getValue(BlockCable.COVER_DOWN) != null;
hasEast = state.getValue(BlockCable.COVER_EAST) != null;
hasWest = state.getValue(BlockCable.COVER_WEST) != null;
}
TextureAtlasSprite sprite = RenderUtils.getSprite(Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState(coverState), coverState, side, rand);
switch (cover.getType()) {
@@ -76,13 +101,7 @@ public class BakedModelCableCover implements IBakedModel {
addNormalCover(quads, sprite, coverSide, hasUp, hasDown, hasEast, hasWest, handle);
break;
case HOLLOW:
addHollowCover(quads, sprite, coverSide, hasUp, hasDown, hasEast, hasWest, 6);
break;
case HOLLOW_MEDIUM:
addHollowCover(quads, sprite, coverSide, hasUp, hasDown, hasEast, hasWest, 3);
break;
case HOLLOW_LARGE:
addHollowCover(quads, sprite, coverSide, hasUp, hasDown, hasEast, hasWest, 2);
addHollowCover(quads, sprite, coverSide, hasUp, hasDown, hasEast, hasWest, getHollowCoverSize(state, coverSide));
break;
}
}

View File

@@ -72,7 +72,7 @@ public class BakedModelCover extends BakedModelCableCover {
public List<BakedQuad> load(CacheKey key) {
List<BakedQuad> quads = new ArrayList<>();
addCover(quads, new Cover(key.stack, key.type), EnumFacing.NORTH, key.side, 0, false, false, false, false, false);
addCover(quads, new Cover(key.stack, key.type), EnumFacing.NORTH, key.side, 0, null, false);
return quads;
}