Finished the initial sorter

This commit is contained in:
Calclavia 2014-03-03 21:57:53 +08:00
parent 4b919ed7e3
commit 7f490b260a
3 changed files with 124 additions and 9 deletions

View file

@ -1,28 +1,122 @@
package resonantinduction.mechanical.logistic.belt; package resonantinduction.mechanical.logistic.belt;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.entity.Entity;
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.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.IModelCustom;
import net.minecraftforge.common.ForgeDirection;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import resonantinduction.api.IFilterable;
import resonantinduction.core.Reference; import resonantinduction.core.Reference;
import resonantinduction.core.prefab.imprint.ItemImprint;
import universalelectricity.api.UniversalElectricity; import universalelectricity.api.UniversalElectricity;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.content.module.TileBase;
import calclavia.lib.content.module.TileRender; import calclavia.lib.content.module.TileRender;
import calclavia.lib.content.module.prefab.TileInventory;
import calclavia.lib.prefab.vector.Cuboid;
import calclavia.lib.render.RenderUtility; import calclavia.lib.render.RenderUtility;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
public class TileSorter extends TileBase public class TileSorter extends TileInventory
{ {
private boolean isInverted = false;
public TileSorter() public TileSorter()
{ {
super(UniversalElectricity.machine); super(UniversalElectricity.machine);
textureName = "material_metal_side"; textureName = "material_metal_side";
maxSlots = 6;
normalRender = false; normalRender = false;
isOpaqueCube = false; isOpaqueCube = false;
bounds = Cuboid.full().expand(-0.1);
}
@Override
public boolean use(EntityPlayer player, int side, Vector3 vector3)
{
return interactCurrentItem(side, player);
}
protected boolean configure(EntityPlayer player, int side, Vector3 vector3)
{
isInverted = !isInverted;
if (world().isRemote)
{
player.addChatMessage("Sorter filter inversion: " + isInverted);
}
return true;
}
@Override
public boolean canStore(ItemStack stack, int slot, ForgeDirection side)
{
return stack.getItem() instanceof IFilterable;
}
@Override
public void collide(Entity entity)
{
if (entity instanceof EntityItem)
{
EntityItem entityItem = (EntityItem) entity;
List<ForgeDirection> possibleDirections = new ArrayList<ForgeDirection>();
/**
* Move item to position where a filter allows it.
*/
for (int i = 0; i < getSizeInventory(); i++)
{
ItemStack stack = getStackInSlot(i);
if (isInverted == ItemImprint.isFiltering(stack, entityItem.getEntityItem()))
{
possibleDirections.add(ForgeDirection.getOrientation(i));
}
}
int size = possibleDirections.size();
if (size > 0)
{
ForgeDirection dir = possibleDirections.get(size > 1 ? world().rand.nextInt(size - 1) : 0);
Vector3 set = center().translate(dir, 0.9);
entityItem.posX = set.x;
entityItem.posY = set.y;
entityItem.posZ = set.z;
}
}
}
@Override
public Cuboid getSelectBounds()
{
return Cuboid.full();
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
nbt.getBoolean("isInverted");
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setBoolean("isInverted", isInverted);
} }
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
@ -40,7 +134,7 @@ public class TileSorter extends TileBase
RenderUtility.enableBlending(); RenderUtility.enableBlending();
GL11.glTranslated(position.x + 0.5, position.y + 0.5, position.z + 0.5); GL11.glTranslated(position.x + 0.5, position.y + 0.5, position.z + 0.5);
RenderUtility.bind(TEXTURE); RenderUtility.bind(TEXTURE);
MODEL.renderAll(); MODEL.renderAllExcept("port");
RenderUtility.disableBlending(); RenderUtility.disableBlending();
GL11.glPopMatrix(); GL11.glPopMatrix();
} }

View file

@ -41,7 +41,7 @@ public class ItemImprint extends Item
if (entity != null && !(entity instanceof IProjectile) && !(entity instanceof EntityPlayer)) if (entity != null && !(entity instanceof IProjectile) && !(entity instanceof EntityPlayer))
{ {
String stringName = EntityList.getEntityString(entity); String stringName = EntityList.getEntityString(entity);
// TODO add to filter // TODO Add to filter
// player.sendChatToPlayer("Target: " + stringName); // player.sendChatToPlayer("Target: " + stringName);
return true; return true;
} }
@ -91,6 +91,27 @@ public class ItemImprint extends Item
itemStack.getTagCompound().setTag("Items", nbt); itemStack.getTagCompound().setTag("Items", nbt);
} }
public static boolean isFiltering(ItemStack filter, ItemStack itemStack)
{
if (filter != null && itemStack != null)
{
Set<ItemStack> checkStacks = getFilters(filter);
if (checkStacks != null)
{
for (ItemStack stack : checkStacks)
{
if (stack.isItemEqual(itemStack))
{
return true;
}
}
}
}
return false;
}
public static HashSet<ItemStack> getFilters(ItemStack itemStack) public static HashSet<ItemStack> getFilters(ItemStack itemStack)
{ {
HashSet<ItemStack> filterStacks = new HashSet<ItemStack>(); HashSet<ItemStack> filterStacks = new HashSet<ItemStack>();

View file

@ -131,14 +131,12 @@ public abstract class RenderItemOverlayTile extends TileEntitySpecialRenderer
renderItemOnSide(tile, itemStack, direction, x, y, z, renderText, amount); renderItemOnSide(tile, itemStack, direction, x, y, z, renderText, amount);
RenderUtility.renderText(renderText, direction, 0.02f, x, y - 0.35f, z); RenderUtility.renderText(renderText, direction, 0.02f, x, y - 0.35f, z);
RenderUtility.renderText(amount, direction, 0.02f, x, y - 0.15f, z); RenderUtility.renderText(amount, direction, 0.02f, x, y - 0.15f, z);
RenderUtility.disableLightmap();
} }
} }
protected static void renderItemOnSide(TileEntity tile, ItemStack itemStack, ForgeDirection direction, double x, double y, double z, String renderText, String amount) protected static void renderItemOnSide(TileEntity tile, ItemStack itemStack, ForgeDirection direction, double x, double y, double z, String renderText, String amount)
{ {
setupLight(tile, direction.offsetX, direction.offsetZ);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
if (itemStack != null) if (itemStack != null)
{ {
@ -169,6 +167,8 @@ public abstract class RenderItemOverlayTile extends TileEntitySpecialRenderer
TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; TextureManager renderEngine = Minecraft.getMinecraft().renderEngine;
setupLight(tile, direction.offsetX, direction.offsetZ);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
GL11.glDisable(2896); GL11.glDisable(2896);
if (!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F)) if (!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F))
@ -193,7 +193,7 @@ public abstract class RenderItemOverlayTile extends TileEntitySpecialRenderer
int br = world.getLightBrightnessForSkyBlocks(tileEntity.xCoord + xDifference, tileEntity.yCoord, tileEntity.zCoord + zDifference, 0); int br = world.getLightBrightnessForSkyBlocks(tileEntity.xCoord + xDifference, tileEntity.yCoord, tileEntity.zCoord + zDifference, 0);
int var11 = br % 65536; int var11 = br % 65536;
int var12 = br / 65536; int var12 = br / 65536;
float scale = 0.6F; float scale = 1;
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, var11 * scale, var12 * scale); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, var11 * scale, var12 * scale);
} }