From ec52959304a75276835113a986db519e33f4fb1a Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 29 Jun 2024 22:26:52 +0200 Subject: [PATCH] the creation of slop --- changelog | 1 + .../hbm/blocks/machine/MachineOreSlopper.java | 38 +++ .../entity/logic/EntityNukeExplosionMK5.java | 2 +- .../container/ContainerOreSlopper.java | 10 +- .../java/com/hbm/inventory/fluid/Fluids.java | 1 + .../com/hbm/inventory/gui/GUIOreSlopper.java | 23 +- .../render/tileentity/RenderOreSlopper.java | 44 +++- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityMachineOreSlopper.java | 216 +++++++++++++++++- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + .../hbm/models/machines/ore_slopper.obj | 32 +-- .../gui/processing/gui_ore_slopper.png | Bin 4332 -> 4436 bytes .../textures/models/machines/ore_slopper.png | Bin 2509 -> 14421 bytes 14 files changed, 344 insertions(+), 32 deletions(-) diff --git a/changelog b/changelog index 64f839ba2..63abe0474 100644 --- a/changelog +++ b/changelog @@ -20,6 +20,7 @@ * Added recipe caching to the combinator funnel, meaning it no longer has to iterate over the entire recipe list all the time for compression/automation, this should improve performance by a fair bit * Diodes now use silicon nuggets instead of nether quartz * Aluminium wire's coloring is now consistent with the ingot +* Nuclear explosions below a radius of 75 no longer have a gamma flash, therefore a high yield mini nuke should no longer be able to instakill someone wearing full euph armor ## Fixed * Fixed crash caused by PRISM updating unloaded worlds diff --git a/src/main/java/com/hbm/blocks/machine/MachineOreSlopper.java b/src/main/java/com/hbm/blocks/machine/MachineOreSlopper.java index 42691c524..8fa11d0ac 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineOreSlopper.java +++ b/src/main/java/com/hbm/blocks/machine/MachineOreSlopper.java @@ -1,12 +1,15 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineOreSlopper; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class MachineOreSlopper extends BlockDummyable { @@ -17,6 +20,7 @@ public class MachineOreSlopper extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachineOreSlopper(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().fluid(); return null; } @@ -32,6 +36,40 @@ public class MachineOreSlopper extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + this.bounding.clear(); + //Base + this.bounding.add(AxisAlignedBB.getBoundingBox(-3.5, 0, -1.5, 3.5, 1, 1.5)); + //Slop bucket + this.bounding.add(AxisAlignedBB.getBoundingBox(0.5, 1, -1.5, 3.5, 3.25, 1.5)); + //Shredder + this.bounding.add(AxisAlignedBB.getBoundingBox(-2.25, 1, -1.5, 0.25, 3.25, -0.75)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-2.25, 1, 0.75, 0.25, 3.25, 1.5)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-2.25, 1, -1.5, -2, 3.25, 1.5)); + this.bounding.add(AxisAlignedBB.getBoundingBox(0, 1, -1.5, 0.25, 3.25, 1.5)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-2, 1, -0.75, 0, 2, 0.75)); + //Outlet + this.bounding.add(AxisAlignedBB.getBoundingBox(-3.25, 1, -1, -2.25, 3, 1)); + return standardOpenBehavior(world, x, y, z, player, side); } + + @Override + public void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + x += dir.offsetX * o; + z += dir.offsetZ * o; + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + this.makeExtra(world, x + dir.offsetX * 3, y, z + dir.offsetZ * 3); + this.makeExtra(world, x - dir.offsetX * 3, y, z - dir.offsetZ * 3); + this.makeExtra(world, x + rot.offsetX, y, z + rot.offsetZ); + this.makeExtra(world, x - rot.offsetX, y, z - rot.offsetZ); + this.makeExtra(world, x + dir.offsetX * 2 + rot.offsetX, y, z + dir.offsetZ * 2 + rot.offsetZ); + this.makeExtra(world, x + dir.offsetX * 2 - rot.offsetX, y, z + dir.offsetZ * 2 - rot.offsetZ); + this.makeExtra(world, x - dir.offsetX * 2 + rot.offsetX, y, z - dir.offsetZ * 2 + rot.offsetZ); + this.makeExtra(world, x - dir.offsetX * 2 - rot.offsetX, y, z - dir.offsetZ * 2 - rot.offsetZ); + } } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index dee4a3d91..3dc6451a8 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -60,7 +60,7 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { ((EntityPlayer)player).triggerAchievement(MainRegistry.achManhattan); } - if(!worldObj.isRemote && fallout && explosion != null && this.ticksExisted < 10) { + if(!worldObj.isRemote && fallout && explosion != null && this.ticksExisted < 10 && strength >= 75) { radiate(2_500_000F / (this.ticksExisted * 5 + 1), this.length * 2); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerOreSlopper.java b/src/main/java/com/hbm/inventory/container/ContainerOreSlopper.java index 1b74dc8f8..213fffa90 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerOreSlopper.java +++ b/src/main/java/com/hbm/inventory/container/ContainerOreSlopper.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; public class ContainerOreSlopper extends Container { @@ -29,8 +30,8 @@ public class ContainerOreSlopper extends Container { this.addSlotToContainer(new SlotCraftingOutput(player.player, slopper, 7, 134, 54)); this.addSlotToContainer(new SlotCraftingOutput(player.player, slopper, 8, 152, 54)); //Upgrades - this.addSlotToContainer(new Slot(slopper, 0, 62, 72)); - this.addSlotToContainer(new Slot(slopper, 0, 80, 72)); + this.addSlotToContainer(new Slot(slopper, 9, 62, 72)); + this.addSlotToContainer(new Slot(slopper, 10, 80, 72)); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { @@ -42,6 +43,11 @@ public class ContainerOreSlopper extends Container { this.addSlotToContainer(new Slot(player, i, 8 + i * 18, 180)); } } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + return null; + } @Override public boolean canInteractWith(EntityPlayer player) { diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 97e4d45d1..cc933de8e 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -494,6 +494,7 @@ public class Fluids { metaOrder.add(SEEDSLURRY); metaOrder.add(COLLOID); metaOrder.add(VITRIOL); + metaOrder.add(SLOP); metaOrder.add(IONGEL); metaOrder.add(PEROXIDE); metaOrder.add(SULFURIC_ACID); diff --git a/src/main/java/com/hbm/inventory/gui/GUIOreSlopper.java b/src/main/java/com/hbm/inventory/gui/GUIOreSlopper.java index 26f4937fc..59458ad6c 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIOreSlopper.java +++ b/src/main/java/com/hbm/inventory/gui/GUIOreSlopper.java @@ -23,12 +23,21 @@ public class GUIOreSlopper extends GuiInfoContainer { this.xSize = 176; this.ySize = 204; } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + slopper.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 18, 34, 52); + slopper.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 18, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 18, 16, 52, slopper.power, slopper.maxPower); + } @Override protected void drawGuiContainerForegroundLayer( int i, int j) { String name = this.slopper.hasCustomInventoryName() ? this.slopper.getInventoryName() : I18n.format(this.slopper.getInventoryName()); - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2 - 9, 6, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); } @@ -37,5 +46,17 @@ public class GUIOreSlopper extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int i = (int) (slopper.progress * 35); + drawTexturedModalRect(guiLeft + 62, guiTop + 52 - i, 176, 34 - i, 34, i); + + int j = (int) (slopper.power * 52 / slopper.maxPower); + drawTexturedModalRect(guiLeft + 8, guiTop + 70 - j, 176, 86 - j, 16, j); + + if(slopper.power >= slopper.consumption) + drawTexturedModalRect(guiLeft + 12, guiTop + 4, 202, 34, 9, 12); + + slopper.tanks[0].renderTank(guiLeft + 26, guiTop + 70, this.zLevel, 16, 52); + slopper.tanks[1].renderTank(guiLeft + 116, guiTop + 70, this.zLevel, 16, 52); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderOreSlopper.java b/src/main/java/com/hbm/render/tileentity/RenderOreSlopper.java index 6db111b7f..9f251eda2 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderOreSlopper.java +++ b/src/main/java/com/hbm/render/tileentity/RenderOreSlopper.java @@ -4,10 +4,15 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; +import com.hbm.render.util.RenderDecoItem; +import com.hbm.tileentity.machine.TileEntityMachineOreSlopper; +import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -15,6 +20,8 @@ import net.minecraft.util.MathHelper; import net.minecraftforge.client.IItemRenderer; public class RenderOreSlopper extends TileEntitySpecialRenderer implements IItemRendererProvider { + + private RenderItem itemRenderer = new RenderDecoItem(this); @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { @@ -29,39 +36,66 @@ public class RenderOreSlopper extends TileEntitySpecialRenderer implements IItem case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; } + + TileEntityMachineOreSlopper slopper = (TileEntityMachineOreSlopper) tile; GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.ore_slopper_tex); ResourceManager.ore_slopper.renderPart("Base"); + + GL11.glPushMatrix(); + + double slide = slopper.prevSlider + (slopper.slider - slopper.prevSlider) * interp; + GL11.glTranslated(0, 0, slide * -3); ResourceManager.ore_slopper.renderPart("Slider"); GL11.glPushMatrix(); - double extend = Math.sin(((tile.getWorldObj().getTotalWorldTime() + interp) * 0.1 % (Math.PI * 2))) * 0.625+ 0.625; + double extend = (slopper.prevBucket + (slopper.bucket - slopper.prevBucket) * interp) * 1.5; GL11.glTranslated(0, -MathHelper.clamp_double(extend - 0.25, 0, 1.25), 0); ResourceManager.ore_slopper.renderPart("Hydraulics"); GL11.glTranslated(0, -MathHelper.clamp_double(extend, 0, 1.25), 0); ResourceManager.ore_slopper.renderPart("Bucket"); + + if(slopper.animation == slopper.animation.LIFTING) { + GL11.glTranslated(0.0625D, 4.3125D, 2D); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glRotatef(90, 0F, 1F, 0F); + GL11.glRotatef(-90, 1F, 0F, 0F); + ItemStack stack = new ItemStack(ModItems.bedrock_ore, 1, 0); + EntityItem item = new EntityItem(null, 0.0D, 0.0D, 0.0D, stack); + item.getEntityItem().stackSize = 1; + item.hoverStart = 0.0F; + RenderItem.renderInFrame = true; + GL11.glScaled(1.75, 1.75, 1.75); + itemRenderer.doRender(item, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + bindTexture(ResourceManager.ore_slopper_tex); + } + + GL11.glPopMatrix(); GL11.glPopMatrix(); - double speed = 10; + double blades = slopper.prevBlades + (slopper.blades - slopper.prevBlades) * interp; GL11.glPushMatrix(); GL11.glTranslated(0.375, 2.75, 0); - GL11.glRotated((tile.getWorldObj().getTotalWorldTime() % 360 + interp) * speed, 0, 0, 1); + GL11.glRotated(blades, 0, 0, 1); GL11.glTranslated(-0.375, -2.75, 0); ResourceManager.ore_slopper.renderPart("BladesLeft"); GL11.glPopMatrix(); GL11.glPushMatrix(); GL11.glTranslated(-0.375, 2.75, 0); - GL11.glRotated((tile.getWorldObj().getTotalWorldTime() % 360 + interp) * -speed, 0, 0, 1); + GL11.glRotated(-blades, 0, 0, 1); GL11.glTranslated(0.375, -2.75, 0); ResourceManager.ore_slopper.renderPart("BladesRight"); GL11.glPopMatrix(); + + double fan = slopper.prevFan + (slopper.fan - slopper.prevFan) * interp; GL11.glPushMatrix(); GL11.glTranslated(0, 1.875, -1); - GL11.glRotated((tile.getWorldObj().getTotalWorldTime() % 360 + interp) * -25, 1, 0, 0); + GL11.glRotated(-fan, 1, 0, 0); GL11.glTranslated(0, -1.875, 1); ResourceManager.ore_slopper.renderPart("Fan"); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 7ebd31097..e83e5b22d 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -91,6 +91,7 @@ public class TileMappings { put(TileEntityMachineExposureChamber.class, "tileentity_exposure_chamber"); put(TileEntityMachineRTG.class, "tileentity_machine_rtg"); put(TileEntityMachineExcavator.class, "tileentity_ntm_excavator"); + put(TileEntityMachineOreSlopper.class, "tileentity_ore_slopper"); put(TileEntityFluidDuctSimple.class, "tileentity_universal_duct_simple"); put(TileEntityFluidDuct.class, "tileentity_universal_duct"); put(TileEntityMachineDrain.class, "tileentity_fluid_drain"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java index dccefcab4..3abaaaabb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineOreSlopper.java @@ -1,32 +1,55 @@ package com.hbm.tileentity.machine; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerOreSlopper; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIOreSlopper; import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.items.special.ItemBedrockOreBase; import com.hbm.items.special.ItemBedrockOreNew; import com.hbm.items.special.ItemBedrockOreNew.BedrockOreGrade; import com.hbm.items.special.ItemBedrockOreNew.BedrockOreType; import com.hbm.lib.Library; +import com.hbm.lib.ModDamageSource; +import com.hbm.main.MainRegistry; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.I18nUtil; +import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.fluid.IFluidStandardTransceiver; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineOreSlopper extends TileEntityMachineBase implements IGUIProvider { +public class TileEntityMachineOreSlopper extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider { public long power; - public static final long maxPower = 1_000_000; + public static final long maxPower = 100_000; public static final int waterUsedBase = 1_000; public int waterUsed = waterUsedBase; @@ -41,9 +64,13 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement public float prevSlider; public float bucket; public float prevBucket; + public float blades; + public float prevBlades; + public float fan; + public float prevFan; public int delay; - public static FluidTank[] tanks; + public FluidTank[] tanks; public double[] ores = new double[BedrockOreType.values().length]; public TileEntityMachineOreSlopper() { @@ -65,6 +92,8 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement @Override public void updateEntity() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + if(!worldObj.isRemote) { this.power = Library.chargeTEFromItems(slots, 0, power, maxPower); @@ -73,11 +102,23 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement FluidType conversion = this.getFluidOutput(tanks[0].getTankType()); if(conversion != null) tanks[1].setTankType(conversion); + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + this.processing = false; + UpgradeManager.eval(slots, 9, 10); + int speed = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3); + int efficiency = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3); + + this.consumption = this.consumptionBase + (this.consumptionBase * speed) / 2 + (this.consumptionBase * efficiency); + if(canSlop()) { this.power -= this.consumption; - this.progress += 1F/200F; + this.progress += 1F / (200 - speed * 50); this.processing = true; boolean markDirty = false; @@ -85,7 +126,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement progress -= 1F; for(BedrockOreType type : BedrockOreType.values()) { - ores[type.ordinal()] += ItemBedrockOreBase.getOreAmount(slots[2], type); + ores[type.ordinal()] += (ItemBedrockOreBase.getOreAmount(slots[2], type) * (1D + efficiency * 0.1)); } this.decrStackSize(2, 1); @@ -96,6 +137,22 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement if(markDirty) this.markDirty(); + List entities = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord + 1, zCoord - 0.5, xCoord + 1.5, yCoord + 3, zCoord + 1.5).offset(dir.offsetX, 0, dir.offsetZ)); + + for(Entity e : entities) { + e.attackEntityFrom(ModDamageSource.turbofan, 1000F); + + if(!e.isEntityAlive() && e instanceof EntityLivingBase) { + NBTTagCompound vdat = new NBTTagCompound(); + vdat.setString("type", "giblets"); + vdat.setInteger("ent", e.getEntityId()); + vdat.setInteger("cDiv", 5); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(vdat, e.posX, e.posY + e.height * 0.5, e.posZ), new TargetPoint(e.dimension, e.posX, e.posY + e.height * 0.5, e.posZ, 150)); + + worldObj.playSoundEffect(e.posX, e.posY, e.posZ, "mob.zombie.woodbreak", 2.0F, 0.95F + worldObj.rand.nextFloat() * 0.2F); + } + } + } else { this.progress = 0; } @@ -109,16 +166,46 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement for(int i = 3; i <= 8; i++) if(slots[i] == null) { slots[i] = output; ores[type.ordinal()] -= 1F; continue outer; } + break outer; } } + this.networkPackNT(150); + } else { this.prevSlider = this.slider; this.prevBucket = this.bucket; + this.prevBlades = this.blades; + this.prevFan = this.fan; if(this.processing) { + this.blades += 15F; + this.fan += 35F; + + if(blades >= 360) { + blades -= 360; + prevBlades -= 360; + } + + if(fan >= 360) { + fan -= 360; + prevFan -= 360; + } + + if(animation == animation.DUMPING && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 4, zCoord + 0.5) <= 50) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "blockdust"); + data.setInteger("block", Block.getIdFromBlock(Blocks.iron_block)); + data.setDouble("posX", xCoord + 0.5 + dir.offsetX + worldObj.rand.nextGaussian() * 0.25); + data.setDouble("posY", yCoord + 4.25); + data.setDouble("posZ", zCoord + 0.5 + dir.offsetZ + worldObj.rand.nextGaussian() * 0.25); + data.setDouble("mY", -0.2D); + MainRegistry.proxy.effectNT(data); + } + if(delay > 0) { delay--; return; @@ -142,7 +229,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement } break; case MOVE_SHREDDER: - this.slider += 1/60F; + this.slider += 1/50F; if(slider >= 1F) { slider = 1F; animation = SlopperAnimation.DUMPING; @@ -153,7 +240,7 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement animation = SlopperAnimation.MOVE_BUCKET; break; case MOVE_BUCKET: - this.slider -= 1/60F; + this.slider -= 1/50F; if(slider <= 0F) { animation = SlopperAnimation.LOWERING; delay = 10; @@ -163,19 +250,76 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement } } } + + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + return new DirPos[] { + new DirPos(xCoord + dir.offsetX * 4, yCoord, zCoord + dir.offsetZ * 4, dir), + new DirPos(xCoord - dir.offsetX * 4, yCoord, zCoord - dir.offsetZ * 4, dir.getOpposite()), + new DirPos(xCoord + rot.offsetX * 2, yCoord, zCoord + rot.offsetZ * 2, rot), + new DirPos(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, rot.getOpposite()), + new DirPos(xCoord + dir.offsetX * 2 + rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2 + rot.offsetZ * 2, rot), + new DirPos(xCoord + dir.offsetX * 2 - rot.offsetX * 2, yCoord, zCoord + dir.offsetZ * 2 - rot.offsetZ * 2, rot.getOpposite()), + new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ * 2, rot), + new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 2, rot.getOpposite()) + }; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return slot == 2 && stack.getItem() == ModItems.bedrock_ore_base; + } + + @Override + public boolean canExtractItem(int i, ItemStack stack, int j) { + return i >= 3 && i <= 8; + } + + private static final int[] slot_access = new int[] {2, 3, 4, 5, 6, 7, 8}; + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return slot_access; + } @Override public void serialize(ByteBuf buf) { super.serialize(buf); buf.writeLong(power); + buf.writeLong(consumption); buf.writeFloat(progress); buf.writeBoolean(processing); + tanks[0].serialize(buf); + tanks[1].serialize(buf); } @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); this.power = buf.readLong(); + this.consumption = buf.readLong(); this.progress = buf.readFloat(); this.processing = buf.readBoolean(); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.power = nbt.getLong("power"); + this.progress = nbt.getFloat("progress"); + tanks[0].readFromNBT(nbt, "water"); + tanks[1].readFromNBT(nbt, "slop"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("power", power); + nbt.setFloat("progress", progress); + tanks[0].writeToNBT(nbt, "water"); + tanks[1].writeToNBT(nbt, "slop"); } public boolean canSlop() { @@ -192,6 +336,39 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement return null; } + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + + @Override public FluidTank[] getAllTanks() { return tanks; } + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks[1]}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0]}; } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 3, + yCoord, + zCoord - 3, + xCoord + 4, + yCoord + 7, + zCoord + 4 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerOreSlopper(player.inventory, this); @@ -202,4 +379,29 @@ public class TileEntityMachineOreSlopper extends TileEntityMachineBase implement public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIOreSlopper(player.inventory, this); } + + @Override + public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) { + return type == UpgradeType.SPEED || type == UpgradeType.EFFECT; + } + + @Override + public void provideInfo(UpgradeType type, int level, List info, boolean extendedInfo) { + info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_ore_slopper)); + if(type == UpgradeType.SPEED) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_DELAY, "-" + (level * 25) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 50) + "%")); + } + if(type == UpgradeType.EFFECT) { + info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_EFFICIENCY, "+" + (level * 10) + "%")); + info.add(EnumChatFormatting.RED + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%")); + } + } + + @Override + public int getMaxLevel(UpgradeType type) { + if(type == UpgradeType.SPEED) return 3; + if(type == UpgradeType.EFFECT) return 3; + return 0; + } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 9c93972a5..579378084 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -369,6 +369,7 @@ container.machineITER=Kernfusionsreaktor container.machineLargeTurbine=Industrielle Dampfturbine container.machineLiquefactor=Verflüssiger container.machineMixer=Industrieller Mixer +container.machineOreSlopper=B.E.M. container.machineRefinery=Ölraffinerie container.machineSelenium=Hochleistungs-Sternmotor container.machineShredder=Brecher @@ -760,6 +761,7 @@ hbmfluid.salient=Saftiges Grün hbmfluid.sas3=Schrabidiumtrisulfat hbmfluid.schrabidic=Schrabidische Säure hbmfluid.seedslurry=Saatgemisch +hbmfluid.slop=Erzpampe hbmfluid.smear=Industrieöl hbmfluid.smoke=Abgas hbmfluid.smoke_leaded=Bleiabgas @@ -1292,6 +1294,7 @@ item.bedrock_ore.type.heavy.name=Schwermetall item.bedrock_ore.type.light.name=Leichtmetall item.bedrock_ore.type.nonmetal.name=Nichtmetall item.bedrock_ore.type.rare.name=Seltenerden +item.bedrock_ore_base.name=Rohes Bedrockerz item.beta.name=Beta-Features item.big_sword.name=Großes Schwert item.billet_am_mix.name=Reaktorfähiges Americiumbillet @@ -4306,6 +4309,7 @@ tile.machine_mixer.name=Industrieller Mixer tile.machine_nuke_furnace_off.name=Atombetriebener Ofen tile.machine_nuke_furnace_on.name=Atombetriebener Ofen tile.machine_orbus.name=Schwerer Magnetischer Lagerbehälter +tile.machine_ore_slopper.name=Bedrockerzmaschine tile.machine_powerrtg.name=PT-Isotopenzelle tile.machine_press.name=Befeuerte Presse tile.machine_puf6_tank.name=Plutoniumhexafluorid-Tank diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 8e784c2b7..3c66144ae 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -770,6 +770,7 @@ container.machineITER=Fusion Reactor container.machineLargeTurbine=Industrial Steam Turbine container.machineLiquefactor=Liquefactor container.machineMixer=Industrial Mixer +container.machineOreSlopper=B.E.P. container.machineRefinery=Oil Refinery container.machineSelenium=Radial Performance Engine container.machineShredder=Shredder @@ -1460,6 +1461,7 @@ hbmfluid.salient=Salient Green hbmfluid.sas3=Schrabidium Trisulfide hbmfluid.schrabidic=Schrabidic Acid hbmfluid.seedslurry=Seeding Slurry +hbmfluid.slop=Ore Slop hbmfluid.smear=Industrial Oil hbmfluid.smoke=Smoke hbmfluid.smoke_leaded=Leaded Smoke @@ -2012,6 +2014,7 @@ item.bedrock_ore.type.heavy.name=Heavy Metal item.bedrock_ore.type.light.name=Light Metal item.bedrock_ore.type.nonmetal.name=Non-Metal item.bedrock_ore.type.rare.name=Rare Earth +item.bedrock_ore_base.name=Raw Bedrock Ore item.beta.name=Beta Features item.big_sword.name=Great Sword item.billet_actinium.name=Actinium-227 Billet @@ -5383,6 +5386,7 @@ tile.machine_mixer.name=Industrial Mixer tile.machine_nuke_furnace_off.name=Nuclear Furnace tile.machine_nuke_furnace_on.name=Nuclear Furnace tile.machine_orbus.name=Heavy Magnetic Storage Tank +tile.machine_ore_slopper.name=Bedrock Ore Processor tile.machine_powerrtg.name=PT Isotope Cell tile.machine_press.name=Burner Press tile.machine_puf6_tank.name=Plutonium Hexafluoride Tank diff --git a/src/main/resources/assets/hbm/models/machines/ore_slopper.obj b/src/main/resources/assets/hbm/models/machines/ore_slopper.obj index 0670c20f5..a49ae6e1c 100644 --- a/src/main/resources/assets/hbm/models/machines/ore_slopper.obj +++ b/src/main/resources/assets/hbm/models/machines/ore_slopper.obj @@ -3676,39 +3676,39 @@ vt 0.121951 0.512821 vt 0.097561 0.692308 vt 0.292683 0.692308 vt 0.121951 0.692308 -vt 0.926829 0.897436 -vt 0.902439 1.000000 +vt 0.878049 1.000000 vt 0.902439 0.897436 +vt 0.902439 1.000000 vt 0.853659 1.000000 vt 0.878049 0.897436 vt 0.878049 1.000000 -vt 0.951219 0.897436 -vt 0.926829 1.000000 +vt 0.853659 1.000000 +vt 0.878049 0.897436 +vt 0.829268 1.000000 +vt 0.853659 0.897436 vt 0.829268 1.000000 vt 0.853659 0.897436 -vt 0.975610 0.897436 -vt 0.951219 1.000000 vt 0.804878 1.000000 vt 0.829268 0.897436 vt 0.975610 1.000000 vt 1.000000 0.897436 vt 1.000000 1.000000 -vt 1.000000 0.897436 -vt 0.975610 1.000000 -vt 0.829268 0.897436 vt 0.804878 1.000000 -vt 0.804878 0.897436 +vt 0.829268 0.897436 +vt 0.975610 1.000000 +vt 1.000000 0.897436 +vt 1.000000 1.000000 +vt 0.951219 1.000000 +vt 0.975610 0.897436 vt 0.951219 1.000000 vt 0.975610 0.897436 -vt 0.853659 0.897436 -vt 0.829268 1.000000 vt 0.926829 1.000000 vt 0.951219 0.897436 -vt 0.878049 0.897436 -vt 0.853659 1.000000 +vt 0.926829 1.000000 +vt 0.951219 0.897436 vt 0.902439 1.000000 vt 0.926829 0.897436 -vt 0.878049 1.000000 +vt 0.926829 0.897436 vt 0.902439 0.897436 vt 0.274390 0.410256 vt 0.246951 0.410256 @@ -3763,7 +3763,7 @@ vt 0.655488 0.487179 vt 0.673781 0.487179 vt 0.390244 0.692308 vt 0.804878 0.897436 -vt 1.000000 1.000000 +vt 0.804878 0.897436 vt 0.646341 0.487179 vt 0.646341 0.487179 vn 0.0000 -1.0000 0.0000 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_ore_slopper.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_ore_slopper.png index 50b928eb72c1cb09dfedfeae11dda007f5dacba2..78e60d2294e94946243363567def4f9730ead303 100644 GIT binary patch delta 3059 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 delta 2952 zcmbtVdo{lSlfFT%~SEuD9{HUNbZX z5n?=Qd4z@-x*5ZGKW3&8mGbKR;F z?D1Y7^+l?})^81Ntd!T*O6T($C4ni5@O!*P&eq4;5H~3mG47q9hM}>!Y$u!~`|~^` zd(QD}rcX&{pxc0pXLw{Nev6}#8|m<|+}Qrx8qtHcL3O)hGDR7E8W(rusB!Y=2paoT zbt@CFUmFqjO}$-zUrwXavJ!`7I?tj_VF4>Sne>MYrI(*t`r~@zR%+CG2L65g zvOdrZ7lhKQ+_~vt_q>$np-Y5ms zeSnI@rjb?7c7a@DVC;vpCDRXQrMe<&weM7?k^&BRy=Z54Y#`Wy4@_&s;3Mymi>)06|+{awl(8L=;r6+LW&C|rIy zyy7Cfa}}qxu~+7M>-s3vWtNLXOOyy=_w)fw^3jd~w}va0foE!&Z=+c4;jx+GbJu}X zQ4@U#^fzt2QoK31h2B8Zl_2%tc>_z;UAP@=e?YQ>r!#E&Dw8KfF^7Jv8;(9tf1GpN zr$y8SURTn9Y+haHHlN^Wz&*FOm~GD}D@c+I7mq-bhx=*DSBEcG@p>JC0t&<2Di!tAiG@gZEANgFFNq zfg;p}D}djMb3|@*)zN_8RYh#JfJP*WFf{V2`;ALk;0b-w>0LhRSVUe26S$KQeGy+? zWxeU@di3y2aA~uA+?S{s$XQg{AP`PyMPkdCy!&;Aami8{Vxcomo#1nr0@!^9MffSk z+&H{sXsqmFnBmFp0zR%arq93aS0u#;Knp+14lZA$>* z1B!kih&1pVv{aEdI>IRg5tqo=1= zFxaj+pD542W#r*j%evrNj5k`M5LLNig8m zUJT9)rimd#z*q`~$K^`gp(>ncH}CD~T3uc33o3N$&1$u-@#rTfcZ3M`NrU_a`p}0{ zW;F&2e?VR9{&FZ_TmvUOY`x4lH_EP5;n$fFEgM(|3}doD=_B7w2Mw_nKZsN)al z)sgX5TF7k)L+ue>LNqVv(G(U*o9F!HanmQsu(@|#z^|C=34cUxD!mifKzvyhvsDzb z497rg#Q5meiw4t5gSm0smG58C3aYBH8=i?&deBqY9C;7upNHQ0dKPZA4-)v$EhAk6 z0}T#`ld`2x%V~8$>rY9Rr_tX^Nod^xK+z-yq}saC9yU@YNuDf>inVgS+-I56}-jn9j2Y& z7AitPC$NGcDea?ls)(Jj4&^x*Qa@{aB5`J)arjY}PP)4yL(w{s-gdi5B!Pr|6tSt4 z$141$C}-2#u!R>M7W!?yW%R5@c%JVFucguQ*CT=kh({3YYJM>)Egr}p5g|q3Cd-$t z#}L&;J?y>th`jD_&`DqT@I|;Ut%+`<7o}k9^iD%GjbL#CqA)N%_a5euv>7Q2KQ(KAyZvKJmO)I3*Nh#N>7!voTt=o$Fp-bv(K}0f z?RrJ`t)xNX^{fHu5)QChr+9ymzd}>j%^rMwcqrqBSw|g{Fd0Bi3AeDBa)08rCTkc5 zGy@-2kV8dv9w+&Gp>FO6X3uo_;O`_IyeC zm}q%#Mh2)mq&UB4NVvXG)D?pM#rOZE55?|RycnqU2{RsqN=)jHy6_+ z_!5%VZTd3)SdQ@h5&4Qf4Y*`xc+*e3MC! zkC&9ubyU0jR2($%N8lt%f4K7bv6j0);;yoGYk-&#RtW~;_We(T{=RT&yaeu6chjUH zW_sGQK6rWuukQj6PtP_iVC`Ir-w0b298-2`;~F)c%CF=r4wG3sZOFr~4+81qLjTMv zUu{4jH7#v=qV3mVV&6_)i_K9P^QS+`B#kGEdYLH?f66Cv6R>4vWvZ(EJiO`GP00dv zyzuXeeCAa%w50{5^ z{&acO$zAw?YxLXkUH_@7iQPP=Cw*6vW7(jEzP^4~NOUJjA`gYZjLk)Zi?%@GgxVTH pJ$}E4tzwK)@+WCac|Z{V3JnComyX%>I&I6*-1NfP^3(43{ta0YRJH&B diff --git a/src/main/resources/assets/hbm/textures/models/machines/ore_slopper.png b/src/main/resources/assets/hbm/textures/models/machines/ore_slopper.png index caf80bcaa9fe6ad0277477b0122c73843917df59..8505a178e83785c5c722504c97bdb7c8268460e9 100644 GIT binary patch literal 14421 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 literal 2509 zcmZ{mc~sKb9>9ONMUMM|Rw`&dGtDd;QCq+g70Xe_%q?6>ElY8U)XW5Rv_x%Sv>rKW zqti_2^wdmnNx@2SnG{lH+_wxxQ(Uq@!QkPW>734-^X?z_-t#^8e7Dc{`#qQFFSZ0Cf*E$`=4YX!*SatRmlyd+eCoz&9b_>nyvcVc%1taKs|k`SrO3s?RWrriSCHoJ01E{gUPKV z0HtC?9tfsvTAr^$zkl1bkXJYGK);Z0qQFl|Lbu$x9+6ATUUi?oUMZ4|48-6Var`=o|{E+8N*+lU89qC_FGhuNNEs$zr*3dqH5&O;BavK1fIKS!?qu`h~T*7MC7D za?FLgpeg~jVboIdZDx5s0#-%$D&(!aG%WU_K8-FPZ_=&{t{PkJzJ22|3h#|V*qa3e z$a=GWh4n1B~qpt+_{^oAS0t3oMyR+ttb68!l8fZs8LNPx<36<@#*f?eq zm%>zs(LM4Alki`^bBq#fV<7Y+W1p!Vc&Xi0mR0br!QIHRH;vUPRkHbRYE*a6P|7R% z)u7Xbk6Yg13AeH3hbr<_?fkJS!DVm2>%z>gbF-AUsfwk!IQJSC0)aLHhQHMINz65F zeuN9RyJb;k2Gg#824Z5KH77bl&pf3scM>V5I-x&19#kQ|3Ep2iXsX1=%oMqR`+3*) zaq=9kmoJuwPB1k#K1q^)zxBcY`LntW+OZ&3csnBd^;L;S+sD2xm}V_^TbzBdrY|b; zOk)2yd=}@&FWT2!LcNsZHy~X|kb*(!_lL#|&ZlA7H^fs;kbG7UcCb=`L_PV~n3hyS zf3#Az|sOP${7k(oMUsY z7*a#iq`ZymDx7f5TKAkH8|OV<{f_B*JAX_y9UjKO_gBA)nw?!~uH9tEw+eKBI%`nt zeJp-*O)9&Ry1q)HXGN+#-E(QG9rlQ+5Ml;P({ovAf9+mos}#vOp;1PbsH`98COL)T z9yHn%FE8w-qzhf6H5sk-!->8xb;`1o0DaJQKvh8p&@0;fcwOhUQU1YKgs?Cp#)xC$ zU_D>s%=5yW>b8Ircxy7Jh;qI4E~UlvFPFXLico7=KfMo{})MQ!8Ox! zVIpvuk-j-#d2dNA!>aVyo>GJU6r|WqS#D+bTHywiU*DMXO}FGfP@$NVFS9$sA*CBj zZWJ&@$W(kId_Z)xR)nb;|H=xjXGf9lH*uhx@7Ju*?8Y68m?VUaYAAz0WgwDnBb>QG#^y zBRig={ONkPzIhV}xRfRr!IjL}1Fq;2?gaxV4>z)?*FuWo-b`DhukCFuy%6x0ccVWX8HBaKue(%Ms5pkw>?g$Lgng zZW~faWa8gVBtIIaPz5DITQ2(pPk=chmJUHxpPAZ+GpI-6QpA-c(%+?;<6Y&F?OiP3e_53d`kZ>8YwgU63a zwk9^G&$Z+w-yCE+AS1)VMi&?8Hh98>@CIQmYIPYWJ=}r2i*cWaPr_qbO?UtFA$Z&l zY7P|WeU87#u#*wJrzDvN)&KY2C&5*A5rGa44#grWw^EN0U!^WCxH1@#1n-v(SQ@8u8aZ8a|#UC?%DFf?lL!ddXnEjS%8_oecf zWXK0u(;#Q)JAo*;ZaViZga)@1E+wakkl26R4QZUSJhr*L}}GXXcttYwfB^y@X;)MZc#wWDLlqy_e~Qtn+W0cR9y^(X?4431W0P!sqiS zxc4=KVt^MUH@k7vr9<4c;!H!IFZuu9(eclb@LA#duBRw3CS+OTxcq+xc({6@s!xPx F{TJx8nRWmG