diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 2b8127ac..b166bb00 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -13,11 +13,13 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.FireBatteryRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; 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.compat.ForgeMultipart.FMPItems; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item.ItemUEMultiPartRenderer; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; +import com.fouristhenumber.utilitiesinexcess.render.CollectorRangeBox; import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; import com.fouristhenumber.utilitiesinexcess.render.TESRUnderworldPortal; import com.gtnewhorizon.gtnhlib.client.model.loading.ModelRegistry; @@ -55,6 +57,10 @@ public void init(FMLInitializationEvent event) { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPortalUnderWorld.class, new TESRUnderworldPortal()); RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); } + if (ModBlocks.COLLECTOR.isEnabled()) { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCollector.class, new CollectorRangeBox()); + + } if (ModItems.GLOVE.isEnabled()) { MinecraftForgeClient.registerItemRenderer(ModItems.GLOVE.get(), new GloveRenderer()); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 45a25f7e..8a27688e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -10,6 +10,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockChandelier; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCollector; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockConveyor; @@ -159,6 +160,7 @@ public enum ModBlocks { DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), CHANDELIER(BlockConfig.chandelier.enableChandelier, new BlockChandelier(), BlockChandelier.ItemBlockChandelier.class, "chandelier"), GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), + 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 8a1d0d88..eb980cc9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -17,6 +17,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityAdvancedBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityChandelier; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityCollector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; @@ -106,7 +107,6 @@ public void preInit(FMLPreInitializationEvent event) { @Mod.EventHandler public void init(FMLInitializationEvent event) { proxy.init(event); - RecipeLoader.run(); MinecraftForge.EVENT_BUS.register(new ForgeEventHandler()); @@ -139,6 +139,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyorUIE"); GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorldUIE"); GameRegistry.registerTileEntity(TileEntitySmartPump.class, "TileEntitySmartPumpUIE"); + GameRegistry.registerTileEntity(TileEntityCollector.class, "TileEntityCollectorUIE"); GameRegistry.registerTileEntity( TileEntityLowTemperatureFurnaceGenerator.class, "TileEntityLowTemperatureFurnaceGeneratorUIE"); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index e92777c3..87562665 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -197,6 +197,8 @@ public static void IMCSender() { sendInfoPage("utilitiesinexcess:lapis_aetherius", "nei.infopage.uie.lapis_aetherius.1"); + sendInfoPage("utilitiesinexcess:collector", "nei.infopage.uie.collector.1"); + sendInfoPage("", "nei.infopage.uie.blackout_curtains.1"); sendInfoPage("", "nei.infopage.uie.underworld_portal.1"); 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..a97c71bc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockCollector.java @@ -0,0 +1,46 @@ +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.util.ChatComponentTranslation; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityCollector; + +public class BlockCollector extends BlockContainer { + + public BlockCollector() { + super(Material.rock); + setBlockName("collector"); + setBlockTextureName("utilitiesinexcess:collector"); + } + + // So you can open chests under it + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @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 collector)) { + return true; + } + + collector.incrementSize(player); + if (!worldIn.isRemote) + player.addChatMessage(new ChatComponentTranslation("uie.chat.collector_size", collector.getSize())); + collector.showBorderFor(40); + 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 c24043b4..1c51e437 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java @@ -24,7 +24,6 @@ public class BlockConveyor extends BlockContainer { public BlockConveyor() { super(Material.piston); - setBlockName("conveyor"); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index d3da592f..bd3620e8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -35,6 +35,19 @@ public static void run() { loadDecorativeBlocksRecipes(); loadColoredBlockRecipes(); + // Collector + addShapedRecipe( + ModBlocks.COLLECTOR, + "eie", + " i ", + "ooo", + 'e', + Items.ender_pearl, + 'i', + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 5), + 'o', + Blocks.obsidian); + // Pacifist's Bench addShapedRecipe( ModBlocks.PACIFISTS_BENCH, @@ -742,7 +755,7 @@ private static void loadWateringCanRecipes() { private static void loadDecorativeBlocksRecipes() { // Ender-Infused Obsidian addShapedRecipe( - new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 1, 5), + new DisableableItemStack(ModBlocks.DECORATIVE_BLOCKS, 4, 5), " o ", "oeo", " o ", 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..63af7b3b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityCollector.java @@ -0,0 +1,120 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +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 { + + private boolean showBorder = false; + public int borderTimer = 0; + public List itemPositions = new ArrayList<>(); + private float size = 4f; + + public float getSize() { + return size; + } + + public void incrementSize(EntityPlayer player) { + if (player.isSneaking()) { + + size -= 0.5f; + if (size == 0f) size = 4f; + } else { + size += 0.5f; + if (size > 4f) size = 0.5f; + } + } + + public void showBorderFor(int ticks) { + this.showBorder = true; + this.borderTimer = ticks; + } + + @Override + public void updateEntity() { + AxisAlignedBB area = getRadiusAABB(); + + if (worldObj.isRemote) { + updateClientEffects(area); + return; + } + + updateServerItemInsertion(area); + } + + private void updateClientEffects(AxisAlignedBB area) { + if (borderTimer > 0 && --borderTimer <= 0) { + showBorder = false; + } + + itemPositions.clear(); + + for (EntityItem item : worldObj.getEntitiesWithinAABB(EntityItem.class, area)) { + + if (item.isDead || !item.onGround) { + continue; + } + + itemPositions.add(Vec3.createVectorHelper(item.posX, item.posY + 0.25, item.posZ)); + } + } + + private void updateServerItemInsertion(AxisAlignedBB area) { + TileEntity te = worldObj.getTileEntity(xCoord, yCoord - 1, zCoord); + if (!(te instanceof IInventory chest)) { + return; + } + + ItemSink sink = ItemUtil.getItemSink(chest, ForgeDirection.UP); + if (sink == null) { + return; + } + + for (EntityItem item : worldObj.getEntitiesWithinAABB(EntityItem.class, area)) { + + if (item.isDead || !item.onGround || item.delayBeforeCanPickup > 0) { + continue; + } + + ItemStack stack = item.getEntityItem(); + if (stack == null) { + continue; + } + + int leftover = sink.store(new InsertionItemStack(stack)); + + if (leftover <= 0) { + item.setDead(); + } else { + stack.stackSize = leftover; + } + } + } + + private AxisAlignedBB getRadiusAABB() { + return AxisAlignedBB.getBoundingBox( + xCoord - size, + yCoord - size, + zCoord - size, + xCoord + size + 1, + yCoord + size + 1, + zCoord + size + 1); + } + + public boolean showBorder() { + return showBorder; + } +} 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 33e3911c..88f22b95 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -92,6 +92,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/CollectorRangeBox.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/CollectorRangeBox.java new file mode 100644 index 00000000..863aafbe --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/CollectorRangeBox.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 CollectorRangeBox 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(); + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 734dbcdb..1f9ebe6d 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -403,7 +403,7 @@ tile.block_update_detector.name=Block Update Detector nei.infopage.uie.block_update_detector.1=This mechanism keeps tabs on neighboring blocks and will emit a redstone pulse if any of them receive a block update. tile.advanced_block_update_detector.name=Advanced Block Update Detector -nei.infopage.uie.advanced.block_update_detector.1=Like the standard Block Update Detector, this block will emit a redstone pulse on neighboring block updates. However, it also reacts to changes to tile-entity data or metadata even without a block update. Shift right click any face of the ABUD to toggle scanning on that side. +nei.infopage.uie.advanced.block_update_detector.1=Like the standard Block Update Detector, this block will emit a redstone pulse on neighboring block updates. However, it also reacts to changes to tile-entity data or metadata even without a block update. Sneak right click any face of the ABUD to toggle scanning on that side. chat.tile.advanced_block_update_detector.toggle=Side %s set to redstone output %s. tile.drum.name=Drum @@ -492,6 +492,12 @@ tile.lapis_aetherius.13.name=Lapis Aetherius Smaragdinus (Dark Green) tile.lapis_aetherius.14.name=Lapis Aetherius Sanguineus (Red) tile.lapis_aetherius.15.name=Lapis Aetherius Ater (Black) +nei.infopage.uie.collector.1=Picks up items dropped in the world and deposits them to inventories placed under it. Right click to increment range and sneak right click to decrement. + +tile.collector.name=Collector + +uie.chat.collector_size=Range: %s blocks + nei.infopage.uie.lapis_aetherius.1=Lapis Aetherius is a luminous decorative block that comes in 16 different colors. Its bright, solid colors are sure to make your base pop! tile.blackout_curtains.name=Blackout Curtains diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/collector.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/collector.png new file mode 100644 index 00000000..0d902a33 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/collector.png differ