diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 0f1aedb7..40531b84 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -3,7 +3,9 @@ import net.minecraftforge.client.MinecraftForgeClient; import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityCollector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.render.CollectorLine; import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; import com.fouristhenumber.utilitiesinexcess.render.TESRUnderworldPortal; @@ -23,5 +25,9 @@ public void init(FMLInitializationEvent event) { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPortalUnderWorld.class, new TESRUnderworldPortal()); RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); } + if (ModBlocks.COLLECTOR.isEnabled()) { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCollector.class, new CollectorLine()); + + } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 863103c7..00ba5f3e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -6,6 +6,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import com.fouristhenumber.utilitiesinexcess.common.blocks.*; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; @@ -99,6 +100,7 @@ public enum ModBlocks { SPIKE_GOLD(BlockConfig.spikes.enableGoldSpike, new BlockSpike(BlockSpike.SpikeType.GOLD, "goldSpike"), BlockSpike.ItemSpike.class, "goldSpike"), SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), + COLLECTOR(BlockConfig.enableCollector, new BlockCollector(), "collector"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 2bf61954..e9037a7c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -11,6 +11,7 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.BlackoutCurtainsRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.LapisAetheriusRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.SpikeRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.*; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; @@ -81,7 +82,6 @@ public void preInit(FMLPreInitializationEvent event) { @Mod.EventHandler public void init(FMLInitializationEvent event) { proxy.init(event); - RecipeLoader.run(); MinecraftForge.EVENT_BUS.register(new ForgeEventHandler()); @@ -102,6 +102,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); + GameRegistry.registerTileEntity(TileEntityCollector.class, "TileEntityCollector"); GameRegistry.registerTileEntity( TileEntityLowTemperatureFurnaceGenerator.class, diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCollector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCollector.java new file mode 100644 index 00000000..32a4bc67 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCollector.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityCollector; + +public class BlockCollector extends BlockContainer { + + public BlockCollector() { + super(Material.rock); + setBlockName("Collector"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityCollector(); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + TileEntity tile = worldIn.getTileEntity(x, y, z); + if (!(tile instanceof TileEntityCollector)) { + return true; + } + TileEntityCollector collector = (TileEntityCollector) tile; + + collector.incrementSize(); + collector.showBorderFor(20); + worldIn.markBlockForUpdate(x, y, z); + + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java index 1a9e55f5..b68dca06 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java @@ -22,7 +22,6 @@ public class BlockConveyor extends BlockContainer { public BlockConveyor() { super(Material.piston); - setBlockName("conveyor"); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityCollector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityCollector.java new file mode 100644 index 00000000..6fccff3e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityCollector.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.gtnhlib.capability.item.ItemSink; +import com.gtnewhorizon.gtnhlib.item.InsertionItemStack; +import com.gtnewhorizon.gtnhlib.util.ItemUtil; + +public class TileEntityCollector extends TileEntity { + + public boolean showBorder = false; + public int borderTimer = 0; + public List itemPositions = new ArrayList<>(); + private float size = 6f; + + public float getSize() { + return size; + } + + public void incrementSize() { + size++; + if (size > 9) size = 1; + } + + public void showBorderFor(int ticks) { + this.showBorder = true; + this.borderTimer = ticks; + } + + @Override + public void updateEntity() { + + if (worldObj.isRemote) { + if (borderTimer > 0) { + borderTimer--; + if (borderTimer <= 0) showBorder = false; + } + + itemPositions.clear(); + List items = worldObj.getEntitiesWithinAABB(EntityItem.class, getRadiusAABB()); + for (EntityItem item : items) { + if (!item.isDead && item.onGround) { + itemPositions.add(Vec3.createVectorHelper(item.posX, item.posY + 0.25, item.posZ)); + } + } + } + + if (!worldObj.isRemote) { + List items = worldObj.getEntitiesWithinAABB(EntityItem.class, getRadiusAABB()); + TileEntity chest = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (!(chest instanceof IInventory)) return; + + for (EntityItem item : items) { + if (item.isDead || !item.onGround || item.delayBeforeCanPickup > 0) continue; + + ItemStack stackInsert = item.getEntityItem(); + if (stackInsert == null) continue; + + ItemSink sink = ItemUtil.getItemSink(chest, ForgeDirection.UP); + if (sink != null) { + int leftover = sink.store(new InsertionItemStack(stackInsert)); + if (leftover <= 0) item.setDead(); + else stackInsert.stackSize = leftover; + } + } + } + } + + private AxisAlignedBB getRadiusAABB() { + return AxisAlignedBB.getBoundingBox( + xCoord - size, + yCoord - size, + zCoord - size, + xCoord + size + 1, + yCoord + size + 1, + zCoord + size + 1); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index 0345bca5..0d774026 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -73,6 +73,9 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableConveyor; + @Config.DefaultBoolean(true) + public static boolean enableCollector; + @Config.DefaultBoolean(true) public static boolean enableUnderWorldPortal; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/CollectorLine.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/CollectorLine.java new file mode 100644 index 00000000..dbd3ae04 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/CollectorLine.java @@ -0,0 +1,105 @@ +package com.fouristhenumber.utilitiesinexcess.render; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityCollector; + +public class CollectorLine extends TileEntitySpecialRenderer { + + private final Map lines = new LinkedHashMap<>(); + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float partialTicks) { + if (!(te instanceof TileEntityCollector collector)) return; + + if (collector.itemPositions != null) { + for (Vec3 pos : collector.itemPositions) { + lines.put(pos, 20); + } + } + + // WHATEVER GO MY OPENGL STATE FLAGS + // how to write open gl a fundamental guide \/ + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST); + GL11.glLineWidth(6.0f); + GL11.glTranslated(x, y, z); + + // force fullbright (fun fact this is what night vision does so i didn't realize that this needed to be set + // UNTIL AFTER IT WORE OFF) + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); + + GL11.glBegin(GL11.GL_LINES); + Iterator> it = lines.entrySet() + .iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + Vec3 target = entry.getKey(); + int life = entry.getValue(); + + float alpha = Math.max(0f, life / 20.0f); + GL11.glColor4f(1.0f, 0f, 0f, alpha); + + double dx = target.xCoord - (te.xCoord); + double dy = target.yCoord - (te.yCoord); + double dz = target.zCoord - (te.zCoord); + + GL11.glVertex3d(.5, .5, .5); + GL11.glVertex3d(dx, dy, dz); + + entry.setValue(life - 1); + if (life <= 0) it.remove(); + } + GL11.glEnd(); + + if (collector.showBorder) { + float r = collector.getSize(); + GL11.glLineWidth(3.0f); + GL11.glBegin(GL11.GL_LINES); + + double[][] edges = { { -r, -r, -r }, { r + 1, -r, -r }, { -r, -r, -r }, { -r, r + 1, -r }, { -r, -r, -r }, + { -r, -r, r + 1 }, { r + 1, r + 1, r + 1 }, { -r, r + 1, r + 1 }, { r + 1, r + 1, r + 1 }, + { r + 1, -r, r + 1 }, { r + 1, r + 1, r + 1 }, { r + 1, r + 1, -r }, { r + 1, -r, -r }, + { r + 1, r + 1, -r }, { r + 1, -r, -r }, { r + 1, -r, r + 1 }, { -r, r + 1, -r }, { -r, r + 1, r + 1 }, + { -r, r + 1, -r }, { r + 1, r + 1, -r }, { -r, -r, r + 1 }, { r + 1, -r, r + 1 }, { -r, -r, r + 1 }, + { -r, r + 1, r + 1 } }; + + long time = System.currentTimeMillis(); + for (int i = 0; i < edges.length; i += 2) { + // wainbow :3 + float hue = (float) ((time * 0.001 + i * 0.1) % 1.0); + float[] rgb = java.awt.Color.getHSBColor(hue, 1.0f, 1.0f) + .getRGBColorComponents(null); + GL11.glColor4f(rgb[0], rgb[1], rgb[2], 0.8f); + + GL11.glVertex3d(edges[i][0], edges[i][1], edges[i][2]); + GL11.glVertex3d(edges[i + 1][0], edges[i + 1][1], edges[i + 1][2]); + } + + GL11.glEnd(); + } + + GL11.glDisable(GL11.GL_LINE_SMOOTH); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + + // clear only new item positions + if (collector.itemPositions != null) collector.itemPositions.clear(); + } +}