From 3f122cd2dd0e4ce7e09577241e8a2700239caf49 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Fri, 14 Mar 2014 18:03:51 +0800 Subject: [PATCH] New sorter model --- .../mechanical/logistic/belt/TileSorter.java | 8 +- .../mechanical/logistic/rail/BlockSorter.java | 117 -------- .../logistic/rail/RenderSorter.java | 62 ----- .../mechanical/logistic/rail/TileSorter.java | 252 ------------------ .../resonantinduction/models/sorter.png | Bin 3582 -> 2646 bytes .../resonantinduction/models/sorter.tcn | Bin 4369 -> 3464 bytes 6 files changed, 6 insertions(+), 433 deletions(-) delete mode 100644 mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/BlockSorter.java delete mode 100644 mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/RenderSorter.java delete mode 100644 mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/TileSorter.java diff --git a/mechanical/src/main/java/resonantinduction/mechanical/logistic/belt/TileSorter.java b/mechanical/src/main/java/resonantinduction/mechanical/logistic/belt/TileSorter.java index c93a2e3dd..ce56107a0 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/logistic/belt/TileSorter.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/logistic/belt/TileSorter.java @@ -255,13 +255,17 @@ public class TileSorter extends TileInventory GL11.glRotatef(90, 0, 0, 1); RenderUtility.rotateBlockBasedOnDirection(dir); - MODEL.renderOnly("port"); + if (TileSorter.this.isInverted) + MODEL.renderOnly("portRed", "connector"); + else + MODEL.renderOnly("portBlue", "connector"); GL11.glPopMatrix(); } } } - MODEL.renderAllExcept("port"); + MODEL.renderAllExcept("portBlue", "portRed", "connector"); + RenderUtility.disableBlending(); GL11.glPopMatrix(); return true; diff --git a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/BlockSorter.java b/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/BlockSorter.java deleted file mode 100644 index 406bd3a08..000000000 --- a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/BlockSorter.java +++ /dev/null @@ -1,117 +0,0 @@ -package resonantinduction.mechanical.logistic.rail; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatMessageComponent; -import net.minecraft.world.World; -import resonantinduction.core.prefab.imprint.BlockImprintable; -import universalelectricity.api.UniversalElectricity; -import calclavia.lib.render.block.BlockRenderingHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * A block that manipulates item movement between inventories. - * - * @author Calclavia, DarkGuardsman - */ -public class BlockSorter extends BlockImprintable -{ - public BlockSorter(int id) - { - super(id, UniversalElectricity.machine); - this.setBlockBounds(0.01f, 0.01f, 0.01f, 0.09f, 0.09f, 0.09f); - } - - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - return AxisAlignedBB.getAABBPool().getAABB(par2, par3, par4, (double) par2 + 1, (double) par3 + 1, (double) par4 + 1); - } - - @Override - public boolean onSneakMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - - if (tileEntity instanceof TileSorter) - { - if (!world.isRemote) - { - ((TileSorter) tileEntity).setSelfPulse(!((TileSorter) tileEntity).isSelfPulse()); - entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Manipulator set to " + (((TileSorter) tileEntity).isSelfPulse() ? "auto pulse" : "not pulse"))); - } - } - return true; - } - - @Override - public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - - if (tileEntity instanceof TileSorter) - { - TileSorter manip = (TileSorter) tileEntity; - boolean manipMode = manip.isOutput(); - boolean inverted = manip.isInverted(); - if (manipMode && !inverted) - { - manip.toggleInversion(); - } - else if (manipMode && inverted) - { - manip.toggleOutput(); - manip.toggleInversion(); - } - else if (!manipMode && !inverted) - { - manip.toggleInversion(); - } - else - { - manip.toggleOutput(); - manip.toggleInversion(); - } - if (!world.isRemote) - { - entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Manipulator outputing = " + manip.isOutput())); - } - } - - return true; - } - - @Override - public TileEntity createNewTileEntity(World var1) - { - return new TileSorter(); - } - - @SideOnly(Side.CLIENT) - @Override - public int getRenderType() - { - return BlockRenderingHandler.ID; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean renderAsNormalBlock() - { - return false; - } - - @Override - public int damageDropped(int par1) - { - return 0; - } -} diff --git a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/RenderSorter.java b/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/RenderSorter.java deleted file mode 100644 index 56bc84cac..000000000 --- a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/RenderSorter.java +++ /dev/null @@ -1,62 +0,0 @@ -package resonantinduction.mechanical.logistic.rail; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import resonantinduction.core.Reference; -import resonantinduction.core.render.RenderImprintable; -import resonantinduction.mechanical.logistic.belt.ModelManipulator; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderSorter extends RenderImprintable -{ - public static final ModelManipulator MODEL = new ModelManipulator(); - public static final ResourceLocation TEXTURE_INPUT = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "manipulator1.png"); - public static final ResourceLocation TEXTURE_OUTPUT = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "manipulator2.png"); - - @Override - public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) - { - TileSorter tile = (TileSorter) tileEntity; - int face = tile.getDirection().ordinal(); - - GL11.glPushMatrix(); - GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F); - GL11.glRotatef(180f, 0f, 0f, 1f); - - if (tile.isOutput()) - { - bindTexture(TEXTURE_INPUT); - } - else - { - bindTexture(TEXTURE_OUTPUT); - } - - if (face == 2) - { - GL11.glRotatef(0f, 0f, 1f, 0f); - } - else if (face == 3) - { - GL11.glRotatef(180f, 0f, 1f, 0f); - } - else if (face == 4) - { - GL11.glRotatef(270f, 0f, 1f, 0f); - } - else if (face == 5) - { - GL11.glRotatef(90f, 0f, 1f, 0f); - } - - MODEL.render(0.0625F, true, 0); - - GL11.glPopMatrix(); - } - -} \ No newline at end of file diff --git a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/TileSorter.java b/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/TileSorter.java deleted file mode 100644 index ba20d493d..000000000 --- a/mechanical/src/main/java/resonantinduction/mechanical/logistic/rail/TileSorter.java +++ /dev/null @@ -1,252 +0,0 @@ -package resonantinduction.mechanical.logistic.rail; - -import java.util.List; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet; -import net.minecraft.util.AxisAlignedBB; -import net.minecraftforge.common.ForgeDirection; -import resonantinduction.core.ResonantInduction; -import resonantinduction.core.prefab.imprint.ItemImprint; -import resonantinduction.core.prefab.imprint.TileFilterable; -import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.mechanical.IManipulator; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.utility.inventory.InternalInventoryHandler; - -import com.google.common.io.ByteArrayDataInput; - -public class TileSorter extends TileFilterable implements IRotatable, IManipulator, IPacketReceiver -{ - /** True to auto output items with a redstone pulse */ - private boolean selfPulse = false; - /** True if outputting items */ - private boolean isOutput = false; - /** True if is currently powered by redstone */ - private boolean isRedstonePowered = false; - /** The class that interacts with inventories for this machine */ - private InternalInventoryHandler invExtractionHelper; - - @Override - public void updateEntity() - { - super.updateEntity(); - if (!this.worldObj.isRemote) - { - if (this.isFunctioning()) - { - if (!this.isOutput) - { - this.enject(); - } - else - { - this.isRedstonePowered = this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - if (this.isSelfPulse() && this.ticks % 10 == 0) - { - this.isRedstonePowered = true; - } - - /** Finds the connected inventory and outputs the items upon a redstone pulse. */ - if (this.isRedstonePowered) - { - this.inject(); - } - } - } - } - } - - /** - * Find items going into the manipulator and input them into an inventory behind this - * manipulator. - */ - @Override - public void enject() - { - Vector3 inputPosition = new Vector3(this); - /** output location up */ - Vector3 outputUp = new Vector3(this); - outputUp.translate(ForgeDirection.UP); - /** output location down */ - Vector3 outputDown = new Vector3(this); - outputDown.translate(ForgeDirection.DOWN); - /** output location facing */ - Vector3 outputPosition = new Vector3(this); - outputPosition.translate(this.getDirection().getOpposite()); - - /** Prevents manipulators from spamming and duping items. */ - if (outputPosition.getTileEntity(this.worldObj) instanceof TileSorter) - { - if (((TileSorter) outputPosition.getTileEntity(this.worldObj)).getDirection() == this.getDirection().getOpposite()) - { - return; - } - } - - AxisAlignedBB bounds = AxisAlignedBB.getBoundingBox(inputPosition.x, inputPosition.y, inputPosition.z, inputPosition.x + 1, inputPosition.y + 1, inputPosition.z + 1); - List itemsInBound = this.worldObj.getEntitiesWithinAABB(EntityItem.class, bounds); - - for (EntityItem entity : itemsInBound) - { - if (entity.isDead) - continue; - - /** - * Try top first, then bottom, then the sides to see if it is possible to insert the - * item into a inventory. - */ - ItemStack remainingStack = entity.getEntityItem().copy(); - - if (this.getFilter() == null || this.isFiltering(remainingStack)) - { - remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputUp, ForgeDirection.UP); - - if (remainingStack != null) - { - remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputDown, ForgeDirection.DOWN); - } - - if (remainingStack != null) - { - remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputPosition, this.getDirection().getOpposite()); - } - - if (remainingStack != null && remainingStack.stackSize > 0) - { - invHelper().throwItem(outputPosition, remainingStack); - } - - entity.setDead(); - } - } - } - - /** Inject items */ - @Override - public void inject() - { - this.isRedstonePowered = false; - /** input location up */ - Vector3 inputUp = new Vector3(this).translate(ForgeDirection.UP); - /** input location down */ - Vector3 inputDown = new Vector3(this).translate(ForgeDirection.DOWN); - /** input location facing */ - Vector3 inputPosition = new Vector3(this).translate(this.getDirection().getOpposite()); - /** output location facing */ - Vector3 outputPosition = new Vector3(this).translate(this.getDirection()); - - ItemStack itemStack = invHelper().tryGrabFromPosition(inputUp, ForgeDirection.UP, 1); - - if (itemStack == null) - { - itemStack = invHelper().tryGrabFromPosition(inputDown, ForgeDirection.DOWN, 1); - } - - if (itemStack == null) - { - itemStack = invHelper().tryGrabFromPosition(inputPosition, this.getDirection().getOpposite(), 1); - } - - if (itemStack != null) - { - if (itemStack.stackSize > 0) - { - invHelper().throwItem(outputPosition, itemStack); - } - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - this.isOutput = nbt.getBoolean("isOutput"); - this.setSelfPulse(nbt.getBoolean("selfpulse")); - } - - /** Writes a tile entity to NBT. */ - @Override - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - nbt.setBoolean("isOutput", this.isOutput); - nbt.setBoolean("selfpulse", this.isSelfPulse()); - } - - @Override - public Packet getDescriptionPacket() - { - return ResonantInduction.PACKET_TILE.getPacket(this, this.isInverted(), this.isSelfPulse(), this.isOutput()); - } - - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - try - { - this.setInverted(data.readBoolean()); - this.setSelfPulse(data.readBoolean()); - this.setOutput(data.readBoolean()); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - public boolean isSelfPulse() - { - return selfPulse; - } - - public void setSelfPulse(boolean selfPulse) - { - this.selfPulse = selfPulse; - } - - /** Gets the class that managed extracting and placing items into inventories */ - public InternalInventoryHandler invHelper() - { - if (invExtractionHelper == null || invExtractionHelper.world != this.worldObj) - { - this.invExtractionHelper = new InternalInventoryHandler(this.worldObj, new Vector3(this), this.getFilter() != null ? ItemImprint.getFilters(getFilter()) : null, this.isInverted()); - } - return invExtractionHelper; - } - - @Override - public void setFilter(ItemStack filter) - { - super.setFilter(filter); - /* Reset inv Helper's filters */ - this.invHelper().setFilter(this.getFilter() != null ? ItemImprint.getFilters(this.getFilter()) : null, this.isInverted()); - } - - /** Is this manipulator set to output items */ - public boolean isOutput() - { - return this.isOutput; - } - - /** True to output items */ - public void setOutput(boolean isOutput) - { - this.isOutput = isOutput; - - if (!this.worldObj.isRemote) - { - this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - } - - /** Inverts the current output state */ - public void toggleOutput() - { - this.setOutput(!this.isOutput()); - } -} diff --git a/src/main/resources/assets/resonantinduction/models/sorter.png b/src/main/resources/assets/resonantinduction/models/sorter.png index 64aaa58e7f83f78fac6b6084edc193c5acb4ab18..73bef67e5ffd785d24a824deb93550fdcf97291c 100644 GIT binary patch delta 1981 zcma)#dpHvc1ID+x&1K2;qNPf%QBZ?thThJwNYxtCsKCYvMALo z6gr2fTn@@LY~-$$adN3#Gvk~;zVFYT=X?Kq-{<{3zg;c9Y7H863T|a-V`B|>MYvj8 zT3EPQA&#JJ5tgn9ILZx$Mp#+sK`8{HkB=QHIqDoCI*EJ~<*4`XVv57#?EcFlf5hgM zfz1CWfdA;E2PKh@MaS6Tek?%zh|M#VaHS_y_#glP>9!jCEbzX4P7P40&RFkBGv*~(^~XEfU{kFtXq^sO27%E|qQr!eOsnv<0dHPD!zxbLe)>BhW14-r zBeM(~+Wx9CEE07Y_ky9CEgp8DyD(}l8m&B?;#?Kh_DC<~r6Fy4hr`+ChPEM5&w4>% z>gBTG=X@t%OD0qSp=->y0K~XS_X&CI)`SNz8(`uQCtSJFaNiofG|toWsSfnR1MP=1 z?=?e_aie>2)^e{EdHRQfmRis2g&Z#W}!FX7+ef7eA10Djuty1azC@7!>$KfmVLG_y) zi(d+Ca1~!pE8Z&=Y;{)WbOneSzQ~3O#;l=+^Ioe=Uzq&rS4A1GoYX@uKhyTWQ3F>i*>N7gthBuzA zE8QCGk%1a^J`frZQ~nd%X@7Zc7Sn$~+I=MX_sPoC3Pbm~t%z}|En`3s7zqY2Ti7tX zM^SsnTZaL-{o|IiGeos%4e`5$X4-E>l!1~0?~d@cJbsWrU5O^J2)qUkZa+|b-bRWr zY+T%lfn6DQh$n=X_A2@AQ5SQ;`2^0_+TVcX>zUcTNJ?T-Lc(oF zKR}1zsf5I9)FLp;-aw)_>-*UG1#j~n$hTRu&6wGR{_C~xn|RV&m{MH}WRjm<7MY{0XW|`b6-5lRGnM$cgOVqr~HU&U> z$_>eK*YqI_OH;0uDuc%0vi%?ejkQ^)k7@^rxTsgLl_zG}|>_jwQEo@7qi%>A9$6>D0NYEKF6Uk~T8V3D!$Jk7!ePvQS+On}ALHScD zgBz-<gRN`kOTF%+hT^__!oI928yx0)ulVp8_gd!&>8T% zC+3C{s>$(b$#-`rHTHIRVmBC(LL9d!Wx<`d0RZ_D?wQjve>f|wt~gUhuUFQk$|~5j z2@8s9F`Ar72Jyvszef`ZPAYOUITH>I|Oee{?nJQ=851|JiRPlz# z=8@8eC?Z+@nn+vZ=r=bR)xZ-t0m~0NHxst7#NPML zm2STb1nsc3W$_a$U;!S#|2{uthim_+sVo19r}7ka)A5()h7?>OEjo?uPh0w{)iUs!X(7T9gV zk8VqAuDCpSm=gb}E=`~EEeoD8u*AsqPA}TUGZRs*86)e?Ao~^!vahh@6U3b(jDp)Z(<7NGK}k~2eAieV}e1)?er^k%{|_s2Jf}D@gy8-H`N+?SbhinPM-Y*?IZ?yX@wJzqHdYkrglg+$g!V zaey{*;GR&G8vp#@)+he6?EEKKWwj1kZ=Riu?8SS#vF;y9zb~_&dT3%3%G$q}QVQEF zYD2+GC*e9DQkR2I)L78noi)3C*eiX|nm=gM1GF=Hpl4mO7}M&zfsEs<*k=N<;}Q9U zU_YWBhkuHI5pTPiQqnahXMZyv(fFG3Jw98zHwZIo&Qe?X)}=H#*m%BL-DljWEB&q+ zbcAJG{;r*9K!v3gXPSC<50iDPkRP_^O~Pid%jFm$s6*gWL;pc7EeV<>cdXXJQ^vV% zC%&x_(0oe9dA%db-x}`XVPtJK;W-@++KlH!sHUmJ{tgsRYk;5?VzbkB=?-LCQzsXM zwKGgV={3xN%u}j;a1*>Oc;B~D)16tkBvY+fP}X_wQY4F@DWp`~2PNRyaP@INl&?|j zJ_EXS@aC*l_=qp>f+`!(BZW2FY34JDz~jMF$;oCJ@bJ3m+aw(3p#+&zp<=R)_yR>K zxDy>!7<|LJY^as~HE(@;TSK3I+sw>t8PRnp;J(@si|GD9r%1e^cGmpv@5gL*bsi4r zjdaaxU>JVbo1{bUwg3dHHW4&W5VFX!gqBREUgFtPdFxlQKgp0>i^H zw2Q%~3E7mi7ak6VQ0AcnK6uO+Epv?1%@1B@H~>iuvf?Cc%pl7wwt41v)OrDdhE&pv zz-eWWu=SG!%M9;?)~RM!WF-a}st;552tryF9FP0jhAXfzt%d%Mei(hcg~0h@Vgx-W@D zqMxzU^A^E(PokCkY{qudmg8(Uxa_8dQ4?ML!*mll_Iz%_Vd2ysXSTdw*Y7gM?8-b6{pav!48zEAt`nx_X6E)AtJ+ zN#~X@_|ZUVHDGctTjLIjouolvja_%}T-V^r~p!4baUAwJ`N$3yo zu-=DC&5EC()2=WBd+~Zk$sLUefyZy-HVADG?ntJj5X#h%T{seNLkX z8%#x@48F)i9P!U7r)T-T)v}GnydHgExIZ`S%Ecp$KIm>p)JPD2=TM`M6Uqrz@5Fwl zB*-?rBUV@x#~J>oR_y>X8suZ`@O7{ql5_-=emnZHiZAeb1;gB5j$QJcPkqE0t$d9|VQSDV?=?@BXOQ9>?vzM3_ z;{rR#gH`_1jHFL;Vx0`%xRO$v8BC65b6MNB25*;Nti(5Lmw2g+xtopigwkLeBJW#K zAp|STXtJeUsqRl4@_pnxhqfJ%)|CA%cw=N*hwUWvOZ^6B@FhzA zx0d-*=VyXq@9L1f=Xv)Kr}~M-yfKy|e;+QN!rw=BC{mx0Rm5L2KmtjV`vC z5r*)ZNHHGQR<ybGAVcYV_RfBbL_q?C5{x2_VDdDoVg+-L`{u+oT zH;8qL(zXtXF@4OAdt^|!_AY-Ae$I%HpU<(N6lsGmsvD&h)f!~cqJ=G)JRKpDP97{k zpnfys#&9dMyf1mVZ~7jqZwyj5?*SB2uh+A|{6SYQvh1y{Ey7UE9;7_uc3Tj~0nTcW z<01%Bh2wp%9`&QpHk>MV5x%wU(#xZ0?m)c=QZ-EZ@9EL3yxAmeDw71sw$dz5Ob~mx z@Jj9t(2js-E1fEz+a}itX?~fPxy~5-q3|5<3rSy^gK_oOu+&&|2fd_ZQm0!ZLoLRB zNl5!2LO9)xu%#fOGxYGh;hIY1w=?B?Fo=ndH84EuV&@%*CpxY4e`Z8prFQd(5580! zB~m_D(^AOKE@=3L?gxfozh+^ diff --git a/src/main/resources/assets/resonantinduction/models/sorter.tcn b/src/main/resources/assets/resonantinduction/models/sorter.tcn index aeb2904897d754dbd1010471607db6199c2f2718..3018d1bd3c5395a7ff22ced024c02950a1afc9d7 100644 GIT binary patch literal 3464 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 Ksyz9>uYUmyX+4Sn