From b5826d226bdda4124eb7a393dbb9d6965e11f349 Mon Sep 17 00:00:00 2001 From: malte0811 Date: Tue, 31 Jul 2018 17:34:18 +0200 Subject: [PATCH] Single component panels work, fixed some bugs with normal ones --- .../blocks/TileEntityIWBase.java | 8 +- .../blocks/controlpanel/BlockPanel.java | 19 ++- .../TileEntityComponentPanel.java | 126 ++++++++++-------- .../controlpanel/TileEntityGeneralCP.java | 35 +++-- .../blocks/controlpanel/TileEntityPanel.java | 10 +- .../controlpanel/ControlPanelNetwork.java | 14 +- .../controlpanel/PanelComponent.java | 2 +- .../items/ItemPanelComponent.java | 24 ++-- 8 files changed, 141 insertions(+), 97 deletions(-) diff --git a/src/main/java/malte0811/industrialWires/blocks/TileEntityIWBase.java b/src/main/java/malte0811/industrialWires/blocks/TileEntityIWBase.java index b23fa47..a9d7dac 100644 --- a/src/main/java/malte0811/industrialWires/blocks/TileEntityIWBase.java +++ b/src/main/java/malte0811/industrialWires/blocks/TileEntityIWBase.java @@ -63,9 +63,11 @@ public abstract class TileEntityIWBase extends TileEntity { } public void triggerRenderUpdate() { - IBlockState state = world.getBlockState(pos); - world.notifyBlockUpdate(pos, state, state, 3); - world.addBlockEvent(pos, state.getBlock(), 255, 0); + if (world!=null) { + IBlockState state = world.getBlockState(pos); + world.notifyBlockUpdate(pos, state, state, 3); + world.addBlockEvent(pos, state.getBlock(), 255, 0); + } } @Override diff --git a/src/main/java/malte0811/industrialWires/blocks/controlpanel/BlockPanel.java b/src/main/java/malte0811/industrialWires/blocks/controlpanel/BlockPanel.java index fb72060..6b2840a 100644 --- a/src/main/java/malte0811/industrialWires/blocks/controlpanel/BlockPanel.java +++ b/src/main/java/malte0811/industrialWires/blocks/controlpanel/BlockPanel.java @@ -21,6 +21,8 @@ import malte0811.industrialWires.blocks.BlockIWBase; import malte0811.industrialWires.blocks.IMetaEnum; import malte0811.industrialWires.controlpanel.PanelComponent; import malte0811.industrialWires.controlpanel.PropertyComponents; +import malte0811.industrialWires.util.MiscUtils; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; @@ -86,6 +88,8 @@ public class BlockPanel extends BlockIWBase implements IMetaEnum { return new TileEntityUnfinishedPanel(); case SINGLE_COMP: return new TileEntityComponentPanel(); + case DUMMY: + return new TileEntityGeneralCP(); default: return null; } @@ -235,7 +239,7 @@ public class BlockPanel extends BlockIWBase implements IMetaEnum { return state.getValue(type)==BlockTypes_Panel.SINGLE_COMP; } - /*@Override + @Override public int getStrongPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { if (blockState.getValue(type)==BlockTypes_Panel.SINGLE_COMP) { TileEntity te = blockAccess.getTileEntity(pos); @@ -256,5 +260,16 @@ public class BlockPanel extends BlockIWBase implements IMetaEnum { } } return 0; - }*/ + } + + @Override + public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) { + super.neighborChanged(state, worldIn, pos, blockIn, fromPos); + if (!worldIn.isRemote) { + TileEntityComponentPanel panel = MiscUtils.getExistingTE(worldIn, pos, TileEntityComponentPanel.class); + if (panel != null) { + panel.updateRSInput(); + } + } + } } diff --git a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityComponentPanel.java b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityComponentPanel.java index d46a2ab..bac0846 100644 --- a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityComponentPanel.java +++ b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityComponentPanel.java @@ -15,58 +15,57 @@ package malte0811.industrialWires.blocks.controlpanel; +import malte0811.industrialWires.controlpanel.ControlPanelNetwork; +import malte0811.industrialWires.controlpanel.PanelComponent; +import malte0811.industrialWires.controlpanel.PropertyComponents; +import malte0811.industrialWires.items.ItemPanelComponent; +import net.minecraft.block.BlockRedstoneWire; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; + +import javax.annotation.Nonnull; + +import static malte0811.industrialWires.util.MiscUtils.apply; + public class TileEntityComponentPanel extends TileEntityPanel { - /*private int rsOut = 0; todo - private Consumer rsIn; + private byte rsOut = 0; public TileEntityComponentPanel() { components = new PropertyComponents.AABBPanelProperties(); + panelNetwork = new SingleCompNetwork(); } @Override - public void update() { - for (PanelComponent pc : components) { - pc.update(); - } + public void onLoad() { + super.onLoad(); if (!world.isRemote) { - if (firstTick&&components.size()>0) { - PanelComponent pc = components.get(0); - pc.registerRSOutput(-1, (channel, value, pcTmp)->{ - rsOut = value; - if (!isInvalid()) { - markBlockForUpdate(pos); - markBlockForUpdate(pos.offset(components.getTop(), -1)); - } - }); - rsIn = pc.getRSInputHandler(-1, this); - updateRS(); - firstTick = false; - } + updateRSInput(); } } - public void updateRS() { - if (rsIn != null) { - int value = world.isBlockIndirectlyGettingPowered(pos); - if (value == 0) { - for (EnumFacing f : EnumFacing.HORIZONTALS) { - IBlockState state = world.getBlockState(pos.offset(f)); - if (state.getBlock() == Blocks.REDSTONE_WIRE && state.getValue(BlockRedstoneWire.POWER) > value) - value = state.getValue(BlockRedstoneWire.POWER); - } + public void updateRSInput() { + int value = world.isBlockIndirectlyGettingPowered(pos); + if (value == 0) { + for (EnumFacing f : EnumFacing.HORIZONTALS) { + IBlockState state = world.getBlockState(pos.offset(f)); + if (state.getBlock() == Blocks.REDSTONE_WIRE && state.getValue(BlockRedstoneWire.POWER) > value) + value = state.getValue(BlockRedstoneWire.POWER); } - byte[] tmp = new byte[16]; - for (int i = 0; i < tmp.length; i++) { - tmp[i] = (byte) value; - } - rsIn.accept(tmp); } + ((SingleCompNetwork)panelNetwork).setGlobalInput((byte) value); } public void markBlockForUpdate(BlockPos pos) { - IBlockState state = world.getBlockState(getBlockPos()); - world.notifyBlockUpdate(pos,state,state,3); - world.notifyNeighborsOfStateChange(pos, state.getBlock(), true); + if (world!=null) { + IBlockState state = world.getBlockState(getBlockPos()); + world.notifyBlockUpdate(pos, state, state, 3); + world.notifyNeighborsOfStateChange(pos, state.getBlock(), true); + } } @Override @@ -78,31 +77,52 @@ public class TileEntityComponentPanel extends TileEntityPanel { return defAABB; } - @Override - public void registerRS(TileEntityRSPanelConn te) { - //NO-OP - } - - @Override - public void unregisterRS(TileEntityRSPanelConn te) { - //NO-OP - } - - @Override - public boolean interactsWithRSWires() { - return false; - } - public int getRSOutput() { return rsOut; } @Nonnull @Override - public ItemStack getTileDrop(@Nonnull EntityPlayer player, @Nonnull IBlockState state) { + public ItemStack getTileDrop(EntityPlayer player, @Nonnull IBlockState state) { if (components.size()<1) { return ItemStack.EMPTY; } return ItemPanelComponent.stackFromComponent(components.get(0)); } -*/} + + @Override + public boolean canJoinNetwork() { + return false; + } + + public void setComponent(PanelComponent comp) { + components.clear(); + components.add(comp); + comp.setPanel(this); + comp.setNetwork(panelNetwork); + } + + private class SingleCompNetwork extends ControlPanelNetwork { + @Override + public void setOutputs(IOwner owner, RSChannelState... out) { + super.setOutputs(owner, out); + byte oldOut = rsOut; + rsOut = 0; + for (OutputValue s:activeOutputs.values()) { + rsOut = (byte) Math.max(rsOut, s.getTargetState().getStrength()); + } + if (oldOut!=rsOut) { + markBlockForUpdate(pos); + } + } + + public void setGlobalInput(byte value) { + for (RSChannel channel: listeners.keySet()) { + RSChannelState state = new RSChannelState(channel, value); + for (ChangeListener l:listeners.get(channel)) { + l.onChange(state); + } + } + } + } +} diff --git a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityGeneralCP.java b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityGeneralCP.java index 07f5faf..56d83ae 100644 --- a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityGeneralCP.java +++ b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityGeneralCP.java @@ -19,12 +19,13 @@ import malte0811.industrialWires.blocks.TileEntityIWBase; import malte0811.industrialWires.controlpanel.ControlPanelNetwork; import malte0811.industrialWires.controlpanel.ControlPanelNetwork.IOwner; import malte0811.industrialWires.util.MiscUtils; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import javax.annotation.Nonnull; -public abstract class TileEntityGeneralCP extends TileEntityIWBase implements IOwner { +public class TileEntityGeneralCP extends TileEntityIWBase implements IOwner { @Nonnull protected ControlPanelNetwork panelNetwork = new ControlPanelNetwork(); @@ -37,16 +38,18 @@ public abstract class TileEntityGeneralCP extends TileEntityIWBase implements IO super.onLoad(); if (!world.isRemote) { boolean isFinalNet = false; - for (EnumFacing side : EnumFacing.VALUES) { - BlockPos posSide = pos.offset(side); - TileEntityGeneralCP neighbour = MiscUtils.getExistingTE(world, posSide, TileEntityGeneralCP.class); - if (neighbour != null) { - if (!isFinalNet) { - panelNetwork = neighbour.panelNetwork; - panelNetwork.addMember(this); - isFinalNet = true; - } else { - neighbour.panelNetwork.replaceWith(panelNetwork, world); + if (canJoinNetwork()) { + for (EnumFacing side : EnumFacing.VALUES) { + BlockPos posSide = pos.offset(side); + TileEntityGeneralCP neighbour = MiscUtils.getExistingTE(world, posSide, TileEntityGeneralCP.class); + if (neighbour != null && neighbour.canJoinNetwork()) { + if (!isFinalNet) { + panelNetwork = neighbour.panelNetwork; + panelNetwork.addMember(this); + isFinalNet = true; + } else { + neighbour.panelNetwork.replaceWith(panelNetwork, world); + } } } } @@ -62,6 +65,12 @@ public abstract class TileEntityGeneralCP extends TileEntityIWBase implements IO panelNetwork.removeMember(pos, world); } + @Override + public void writeNBT(NBTTagCompound out, boolean updatePacket) {} + + @Override + public void readNBT(NBTTagCompound in, boolean updatePacket) {} + @Override public void invalidate() { super.invalidate(); @@ -72,4 +81,8 @@ public abstract class TileEntityGeneralCP extends TileEntityIWBase implements IO public BlockPos getBlockPos() { return pos; } + + public boolean canJoinNetwork() { + return true; + } } diff --git a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityPanel.java b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityPanel.java index ad7e1e3..3e84b5e 100644 --- a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityPanel.java +++ b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityPanel.java @@ -46,9 +46,9 @@ import javax.annotation.Nullable; import static malte0811.industrialWires.util.MiscUtils.apply; -public class TileEntityPanel extends TileEntityGeneralCP implements IDirectionalTile, IBlockBoundsIW, IPlayerInteraction, ITickable, IEBlockInterfaces.ITileDrop { +public class TileEntityPanel extends TileEntityGeneralCP implements IDirectionalTile, IBlockBoundsIW, IPlayerInteraction, + ITickable, IEBlockInterfaces.ITileDrop { protected PropertyComponents.PanelRenderProperties components = new PropertyComponents.PanelRenderProperties(); - public boolean firstTick = true; { int[] colors = { @@ -132,9 +132,11 @@ public class TileEntityPanel extends TileEntityGeneralCP implements IDirectional NBTTagList l = nbt.getTagList("components", 10); PanelUtils.readListFromNBT(l, components); panelNetwork.removeIOFor(this); - for (PanelComponent pc:components) { + for (PanelComponent pc : components) { pc.setPanel(this); - pc.setNetwork(panelNetwork); + if (world == null || !world.isRemote) { + pc.setNetwork(panelNetwork); + } } components.setHeight(nbt.getFloat("height")); components.setAngle(nbt.getFloat("angle")); diff --git a/src/main/java/malte0811/industrialWires/controlpanel/ControlPanelNetwork.java b/src/main/java/malte0811/industrialWires/controlpanel/ControlPanelNetwork.java index 47da73a..54eb570 100644 --- a/src/main/java/malte0811/industrialWires/controlpanel/ControlPanelNetwork.java +++ b/src/main/java/malte0811/industrialWires/controlpanel/ControlPanelNetwork.java @@ -32,11 +32,11 @@ import java.util.function.Consumer; @SuppressWarnings({"unused", "WeakerAccess"}) public class ControlPanelNetwork { - private Map> listeners = new HashMap<>(); - private Map> allOutputs = new HashMap<>(); - private Map activeOutputs = new HashMap<>(); - private Map secondActiveOutputs = new HashMap<>(); - private Set members = new HashSet<>(); + protected Map> listeners = new HashMap<>(); + protected Map> allOutputs = new HashMap<>(); + protected Map activeOutputs = new HashMap<>(); + protected Map secondActiveOutputs = new HashMap<>(); + protected Set members = new HashSet<>(); public void addListener(IOwner owner, Consumer listener, RSChannel... channels) { ChangeListener l = new ChangeListener(owner, listener); @@ -232,7 +232,7 @@ public class ControlPanelNetwork { } } - private static class ChangeListener extends Owned { + protected static class ChangeListener extends Owned { private final Consumer listener; private ChangeListener(IOwner owner, Consumer listener) { @@ -245,7 +245,7 @@ public class ControlPanelNetwork { } } - private static class OutputValue extends Owned { + protected static class OutputValue extends Owned { private final RSChannelState targetState; private OutputValue(@Nullable IOwner owner, RSChannelState targetState) { diff --git a/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java b/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java index b4b8815..a27e489 100644 --- a/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java +++ b/src/main/java/malte0811/industrialWires/controlpanel/PanelComponent.java @@ -136,7 +136,7 @@ public abstract class PanelComponent implements IOwner { @Override public BlockPos getBlockPos() { - return panel.getBlockPos(); + return panel.getPos(); } public void writeToNBT(NBTTagCompound nbt, boolean toItem) { diff --git a/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java b/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java index b3c9a5b..cd4f261 100644 --- a/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java +++ b/src/main/java/malte0811/industrialWires/items/ItemPanelComponent.java @@ -17,14 +17,14 @@ package malte0811.industrialWires.items; import blusunrize.immersiveengineering.api.ApiUtils; import blusunrize.immersiveengineering.client.ClientProxy; -import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces; import malte0811.industrialWires.IndustrialWires; import malte0811.industrialWires.blocks.controlpanel.BlockTypes_Panel; -import malte0811.industrialWires.blocks.controlpanel.TileEntityPanel; +import malte0811.industrialWires.blocks.controlpanel.TileEntityComponentPanel; import malte0811.industrialWires.controlpanel.IConfigurableComponent; import malte0811.industrialWires.controlpanel.PanelComponent; import malte0811.industrialWires.controlpanel.PanelUtils; import malte0811.industrialWires.controlpanel.SevenSegDisplay; +import malte0811.industrialWires.util.MiscUtils; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; @@ -33,13 +33,11 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -187,7 +185,7 @@ public class ItemPanelComponent extends Item implements INetGUIItem { ItemStack itemstack = player.getHeldItem(hand); - if (!itemstack.isEmpty() && player.canPlayerEdit(pos, facing, itemstack) && worldIn.mayPlace(IndustrialWires.panel, pos, false, facing, (Entity) null)) { + if (!itemstack.isEmpty() && player.canPlayerEdit(pos, facing, itemstack) && worldIn.mayPlace(IndustrialWires.panel, pos, false, facing, null)) { placeBlockAt(itemstack, player, worldIn, pos, facing, hitX, hitY, hitZ); SoundType soundtype = worldIn.getBlockState(pos).getBlock().getSoundType(worldIn.getBlockState(pos), worldIn, pos, player); worldIn.playSound(player, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); @@ -202,17 +200,11 @@ public class ItemPanelComponent extends Item implements INetGUIItem { private void placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ) { IBlockState state = IndustrialWires.panel.getStateFromMeta(BlockTypes_Panel.SINGLE_COMP.ordinal()); world.setBlockState(pos, state); - TileEntity te = world.getTileEntity(pos); - if (te instanceof IEBlockInterfaces.IDirectionalTile) { - EnumFacing dir = ((IEBlockInterfaces.IDirectionalTile) te).getFacingForPlacement(player, pos, side, hitX, hitY, hitZ); - ((IEBlockInterfaces.IDirectionalTile) te).setFacing(dir); - } - if (te instanceof IEBlockInterfaces.ITileDrop) { - ((IEBlockInterfaces.ITileDrop) te).readOnPlacement(player, stack); - } - if (te instanceof TileEntityPanel) { - ((TileEntityPanel) te).getComponents().clear(); - ((TileEntityPanel) te).getComponents().add(componentFromStack(stack)); + TileEntityComponentPanel te = MiscUtils.getExistingTE(world, pos, TileEntityComponentPanel.class); + if (te!=null) { + EnumFacing dir = te.getFacingForPlacement(player, pos, side, hitX, hitY, hitZ); + te.setFacing(dir); + te.setComponent(componentFromStack(stack)); } }