From 86a531cebe116477304ee861ea714cadd3f708e3 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 19 Jun 2022 19:44:30 +0200 Subject: [PATCH] more arty stuff, conveyor fixes, crane retexture --- .../com/hbm/blocks/network/CraneInserter.java | 5 +- .../projectile/EntityArtilleryShell.java | 139 ++++++++ .../entity/projectile/EntityThrowableNT.java | 311 ++++++++++++++++++ .../container/ContainerMassStorage.java | 7 + .../java/com/hbm/inventory/fluid/Fluids.java | 4 +- .../com/hbm/inventory/gui/GUITurretArty.java | 5 +- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/weapon/ItemAmmoArty.java | 69 ++++ src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 2 +- .../projectile/RenderArtilleryShell.java | 41 +++ .../render/tileentity/RenderTurretArty.java | 3 + .../storage/TileEntityMassStorage.java | 10 + .../network/TileEntityCraneInserter.java | 5 + .../turret/TileEntityTurretArty.java | 166 ++++++++-- .../turret/TileEntityTurretBaseNT.java | 33 +- src/main/resources/assets/hbm/sounds.json | 3 + .../assets/hbm/sounds/block/storageClose.ogg | Bin 0 -> 4369 bytes .../assets/hbm/sounds/block/storageOpen.ogg | Bin 0 -> 4426 bytes .../hbm/sounds/weapon/mortarWhistle.ogg | Bin 0 -> 11062 bytes .../assets/hbm/textures/blocks/crane_in.png | Bin 221 -> 305 bytes .../textures/blocks/crane_in_side_down.png | Bin 259 -> 421 bytes .../hbm/textures/blocks/crane_in_side_up.png | Bin 259 -> 419 bytes .../hbm/textures/blocks/crane_in_top.png | Bin 253 -> 364 bytes .../assets/hbm/textures/blocks/crane_out.png | Bin 178 -> 252 bytes .../textures/blocks/crane_out_side_down.png | Bin 253 -> 415 bytes .../hbm/textures/blocks/crane_out_side_up.png | Bin 254 -> 412 bytes .../hbm/textures/blocks/crane_out_top.png | Bin 244 -> 355 bytes .../assets/hbm/textures/blocks/crane_side.png | Bin 176 -> 349 bytes .../hbm/textures/blocks/crane_side_in.png | Bin 239 -> 358 bytes .../hbm/textures/blocks/crane_side_out.png | Bin 199 -> 325 bytes .../assets/hbm/textures/blocks/crane_top.png | Bin 162 -> 290 bytes .../textures/gui/weapon/gui_turret_arty.png | Bin 4431 -> 4645 bytes .../textures/items/ammo_arty_mini_nuke.png | Bin 338 -> 327 bytes 34 files changed, 763 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java create mode 100644 src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java create mode 100644 src/main/java/com/hbm/items/weapon/ItemAmmoArty.java create mode 100644 src/main/java/com/hbm/render/entity/projectile/RenderArtilleryShell.java create mode 100644 src/main/resources/assets/hbm/sounds/block/storageClose.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/storageOpen.ogg create mode 100644 src/main/resources/assets/hbm/sounds/weapon/mortarWhistle.ogg diff --git a/src/main/java/com/hbm/blocks/network/CraneInserter.java b/src/main/java/com/hbm/blocks/network/CraneInserter.java index 9b67b3eb6..4a78bb8e3 100644 --- a/src/main/java/com/hbm/blocks/network/CraneInserter.java +++ b/src/main/java/com/hbm/blocks/network/CraneInserter.java @@ -130,7 +130,8 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { int index = access == null ? i : access[i]; ItemStack stack = inv.getStackInSlot(index); - if(stack != null && toAdd.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(toAdd, stack) && stack.stackSize < Math.min(stack.getMaxStackSize(), limit)) { + if(stack != null && toAdd.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(toAdd, stack) && stack.stackSize < Math.min(stack.getMaxStackSize(), limit) + && ((sided == null || sided.canInsertItem(index, toAdd, side)) && inv.isItemValidForSlot(index, toAdd))) { int stackLimit = Math.min(stack.getMaxStackSize(), limit); int amount = Math.min(toAdd.stackSize, stackLimit - stack.stackSize); @@ -149,7 +150,7 @@ public class CraneInserter extends BlockCraneBase implements IEnterableBlock { int index = access == null ? i : access[i]; ItemStack stack = inv.getStackInSlot(index); - if(stack == null && (sided != null ? sided.canInsertItem(index, toAdd, side) : inv.isItemValidForSlot(index, toAdd))) { + if(stack == null && ((sided == null || sided.canInsertItem(index, toAdd, side)) && inv.isItemValidForSlot(index, toAdd))) { int amount = Math.min(toAdd.stackSize, limit); diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java new file mode 100644 index 000000000..94db45ec8 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryShell.java @@ -0,0 +1,139 @@ +package com.hbm.entity.projectile; + +import com.hbm.entity.logic.IChunkLoader; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; + +public class EntityArtilleryShell extends EntityThrowableNT implements IChunkLoader { + + private Ticket loaderTicket; + + private int turnProgress; + private double syncPosX; + private double syncPosY; + private double syncPosZ; + private double syncYaw; + private double syncPitch; + @SideOnly(Side.CLIENT) + private double velocityX; + @SideOnly(Side.CLIENT) + private double velocityY; + @SideOnly(Side.CLIENT) + private double velocityZ; + + private double targetX; + private double targetY; + private double targetZ; + private boolean didWhistle = false; + + public EntityArtilleryShell(World world) { + super(world); + this.ignoreFrustumCheck = true; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + return true; + } + + public void setTarget(int x, int y, int z) { + this.targetX = x; + this.targetY = y; + this.targetZ = z; + } + + @Override + public void onUpdate() { + + if(!worldObj.isRemote) { + super.onUpdate(); + + if(!didWhistle) { + double speed = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); + double deltaX = this.posX - this.targetX; + double deltaZ = this.posZ - this.targetZ; + double dist = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ); + + if(speed * 18 > dist) { + worldObj.playSoundEffect(this.targetX, this.targetY, this.targetZ, "hbm:turret.mortarWhistle", 5.0F, 1.0F); + this.didWhistle = true; + } + } + + } else { + if(this.turnProgress > 0) { + double interpX = this.posX + (this.syncPosX - this.posX) / (double) this.turnProgress; + double interpY = this.posY + (this.syncPosY - this.posY) / (double) this.turnProgress; + double interpZ = this.posZ + (this.syncPosZ - this.posZ) / (double) this.turnProgress; + double d = MathHelper.wrapAngleTo180_double(this.syncYaw - (double) this.rotationYaw); + this.rotationYaw = (float) ((double) this.rotationYaw + d / (double) this.turnProgress); + this.rotationPitch = (float)((double)this.rotationPitch + (this.syncPitch - (double)this.rotationPitch) / (double)this.turnProgress); + --this.turnProgress; + this.setPosition(interpX, interpY, interpZ); + } else { + this.setPosition(this.posX, this.posY, this.posZ); + } + } + } + + @SideOnly(Side.CLIENT) + public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { + this.velocityX = this.motionX = p_70016_1_; + this.velocityY = this.motionY = p_70016_3_; + this.velocityZ = this.motionZ = p_70016_5_; + } + + @SideOnly(Side.CLIENT) + public void setPositionAndRotation2(double x, double y, double z, float yaw, float pitch, int theNumberThree) { + this.syncPosX = x; + this.syncPosY = y; + this.syncPosZ = z; + this.syncYaw = yaw; + this.syncPitch = pitch; + this.turnProgress = theNumberThree; + this.motionX = this.velocityX; + this.motionY = this.velocityY; + this.motionZ = this.velocityZ; + } + + @Override + protected void onImpact(MovingObjectPosition mop) { + + if(!worldObj.isRemote) { + Vec3 vec = Vec3.createVectorHelper(motionX, motionY, motionZ).normalize(); + this.worldObj.newExplosion(this, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, 15F, false, false); + this.setDead(); + } + } + + @Override + public void init(Ticket ticket) { + if(!worldObj.isRemote && ticket != null) { + if(loaderTicket == null) { + loaderTicket = ticket; + loaderTicket.bindEntity(this); + loaderTicket.getModData(); + } + ForgeChunkManager.forceChunk(loaderTicket, new ChunkCoordIntPair(chunkCoordX, chunkCoordZ)); + } + } + + @Override + protected float getAirDrag() { + return 1.0F; + } + + @Override + public double getGravityVelocity() { + return 9.81 * 0.05; + } +} diff --git a/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java new file mode 100644 index 000000000..cfbfabc17 --- /dev/null +++ b/src/main/java/com/hbm/entity/projectile/EntityThrowableNT.java @@ -0,0 +1,311 @@ +package com.hbm.entity.projectile; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +/** + * Near-identical copy of EntityThrowable but deobfuscated & untangled + * @author hbm + * + */ +public abstract class EntityThrowableNT extends Entity implements IProjectile { + + private int stuckBlockX = -1; + private int stuckBlockY = -1; + private int stuckBlockZ = -1; + private Block stuckBlock; + protected boolean inGround; + public int throwableShake; + private EntityLivingBase thrower; + private String throwerName; + private int ticksInGround; + private int ticksInAir; + + public EntityThrowableNT(World world) { + super(world); + this.setSize(0.25F, 0.25F); + } + + @Override + protected void entityInit() { } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double dist) { + + double perimeter = this.boundingBox.getAverageEdgeLength() * 4.0D; + perimeter *= 64.0D; + return dist < perimeter * perimeter; + } + + public EntityThrowableNT(World world, EntityLivingBase thrower) { + super(world); + this.thrower = thrower; + this.setSize(0.25F, 0.25F); + this.setLocationAndAngles(thrower.posX, thrower.posY + (double) thrower.getEyeHeight(), thrower.posZ, thrower.rotationYaw, thrower.rotationPitch); + this.posX -= (double) (MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F); + this.posY -= 0.1D; + this.posZ -= (double) (MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * 0.16F); + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + float velocity = 0.4F; + this.motionX = (double) (-MathHelper.sin(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * velocity); + this.motionZ = (double) (MathHelper.cos(this.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float) Math.PI) * velocity); + this.motionY = (double) (-MathHelper.sin((this.rotationPitch + this.throwAngle()) / 180.0F * (float) Math.PI) * velocity); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.throwForce(), 1.0F); + } + + public EntityThrowableNT(World world, double x, double y, double z) { + super(world); + this.ticksInGround = 0; + this.setSize(0.25F, 0.25F); + this.setPosition(x, y, z); + this.yOffset = 0.0F; + } + + protected float throwForce() { + return 1.5F; + } + + protected float throwAngle() { + return 0.0F; + } + + @Override + public void setThrowableHeading(double motionX, double motionY, double motionZ, float velocity, float inaccuracy) { + float throwLen = MathHelper.sqrt_double(motionX * motionX + motionY * motionY + motionZ * motionZ); + motionX /= (double) throwLen; + motionY /= (double) throwLen; + motionZ /= (double) throwLen; + motionX += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionY += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionZ += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionX *= (double) velocity; + motionY *= (double) velocity; + motionZ *= (double) velocity; + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + float hyp = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(motionX, motionZ) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(motionY, (double) hyp) * 180.0D / Math.PI); + this.ticksInGround = 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void setVelocity(double x, double y, double z) { + this.motionX = x; + this.motionY = y; + this.motionZ = z; + + if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) { + float hyp = MathHelper.sqrt_double(x * x + z * z); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(x, z) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(y, (double) hyp) * 180.0D / Math.PI); + } + } + + @Override + public void onUpdate() { + this.lastTickPosX = this.posX; + this.lastTickPosY = this.posY; + this.lastTickPosZ = this.posZ; + super.onUpdate(); + + if(this.throwableShake > 0) { + --this.throwableShake; + } + + if(this.inGround) { + if(this.worldObj.getBlock(this.stuckBlockX, this.stuckBlockY, this.stuckBlockZ) == this.stuckBlock) { + ++this.ticksInGround; + + if(this.groundDespawn() > 0 && this.ticksInGround == this.groundDespawn()) { + this.setDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= (double) (this.rand.nextFloat() * 0.2F); + this.motionY *= (double) (this.rand.nextFloat() * 0.2F); + this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); + this.ticksInGround = 0; + this.ticksInAir = 0; + } else { + ++this.ticksInAir; + } + + Vec3 pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition mop = this.worldObj.rayTraceBlocks(pos, nextPos); + pos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + nextPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if(mop != null) { + nextPos = Vec3.createVectorHelper(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord); + } + + if(!this.worldObj.isRemote) { + + Entity hitEntity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double nearest = 0.0D; + EntityLivingBase thrower = this.getThrower(); + + for(int j = 0; j < list.size(); ++j) { + Entity entity = (Entity) list.get(j); + + if(entity.canBeCollidedWith() && (entity != thrower || this.ticksInAir >= 5)) { + double hitbox = 0.3F; + AxisAlignedBB aabb = entity.boundingBox.expand(hitbox, hitbox, hitbox); + MovingObjectPosition hitMop = aabb.calculateIntercept(pos, nextPos); + + if(hitMop != null) { + double dist = pos.distanceTo(hitMop.hitVec); + + if(dist < nearest || nearest == 0.0D) { + hitEntity = entity; + nearest = dist; + } + } + } + } + + if(hitEntity != null) { + mop = new MovingObjectPosition(hitEntity); + } + } + + if(mop != null) { + if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ) == Blocks.portal) { + this.setInPortal(); + } else { + this.onImpact(mop); + } + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + + float hyp = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + + for(this.rotationPitch = (float) (Math.atan2(this.motionY, (double) hyp) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while(this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while(this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float drag = this.getAirDrag(); + double gravity = this.getGravityVelocity(); + + if(this.isInWater()) { + for(int i = 0; i < 4; ++i) { + float f = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double) f, this.posY - this.motionY * (double) f, this.posZ - this.motionZ * (double) f, this.motionX, this.motionY, this.motionZ); + } + + drag = this.getWaterDrag(); + } + + this.motionX *= (double) drag; + this.motionY *= (double) drag; + this.motionZ *= (double) drag; + this.motionY -= gravity; + this.setPosition(this.posX, this.posY, this.posZ); + } + + public double getGravityVelocity() { + return 0.03D; + } + + protected abstract void onImpact(MovingObjectPosition mop); + + @Override + public void writeEntityToNBT(NBTTagCompound nbt) { + nbt.setShort("xTile", (short) this.stuckBlockX); + nbt.setShort("yTile", (short) this.stuckBlockY); + nbt.setShort("zTile", (short) this.stuckBlockZ); + nbt.setByte("inTile", (byte) Block.getIdFromBlock(this.stuckBlock)); + nbt.setByte("shake", (byte) this.throwableShake); + nbt.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + + if((this.throwerName == null || this.throwerName.length() == 0) && this.thrower != null && this.thrower instanceof EntityPlayer) { + this.throwerName = this.thrower.getCommandSenderName(); + } + + nbt.setString("ownerName", this.throwerName == null ? "" : this.throwerName); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbt) { + this.stuckBlockX = nbt.getShort("xTile"); + this.stuckBlockY = nbt.getShort("yTile"); + this.stuckBlockZ = nbt.getShort("zTile"); + this.stuckBlock = Block.getBlockById(nbt.getByte("inTile") & 255); + this.throwableShake = nbt.getByte("shake") & 255; + this.inGround = nbt.getByte("inGround") == 1; + this.throwerName = nbt.getString("ownerName"); + + if(this.throwerName != null && this.throwerName.length() == 0) { + this.throwerName = null; + } + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + public EntityLivingBase getThrower() { + if(this.thrower == null && this.throwerName != null && this.throwerName.length() > 0) { + this.thrower = this.worldObj.getPlayerEntityByName(this.throwerName); + } + return this.thrower; + } + + /* ================================== Additional Getters =====================================*/ + + protected float getAirDrag() { + return 0.99F; + } + + protected float getWaterDrag() { + return 0.8F; + } + + protected int groundDespawn() { + return 1200; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMassStorage.java b/src/main/java/com/hbm/inventory/container/ContainerMassStorage.java index 07eeea814..8363de61f 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMassStorage.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMassStorage.java @@ -16,6 +16,7 @@ public class ContainerMassStorage extends Container { public ContainerMassStorage(InventoryPlayer invPlayer, TileEntityMassStorage te) { this.storage = te; + this.storage.openInventory(); this.addSlotToContainer(new Slot(storage, 0, 61, 17)); this.addSlotToContainer(new SlotPattern(storage, 1, 61, 53)); @@ -100,4 +101,10 @@ public class ContainerMassStorage extends Container { public boolean canInteractWith(EntityPlayer player) { return storage.isUseableByPlayer(player); } + + @Override + public void onContainerClosed(EntityPlayer p_75134_1_) { + super.onContainerClosed(p_75134_1_); + this.storage.closeInventory(); + } } diff --git a/src/main/java/com/hbm/inventory/fluid/Fluids.java b/src/main/java/com/hbm/inventory/fluid/Fluids.java index 98af390df..d77597286 100644 --- a/src/main/java/com/hbm/inventory/fluid/Fluids.java +++ b/src/main/java/com/hbm/inventory/fluid/Fluids.java @@ -158,7 +158,7 @@ public class Fluids { WASTEFLUID = new RadioactiveLiquid( "WASTEFLUID", 0x544400, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); WASTEGAS = new RadioactiveGas( "WASTEGAS", 0xB8B8B8, 2, 0, 1, EnumSymbol.RADIATION).setRadiation(0.5F).addTraits(FluidTrait.NO_CONTAINER); GASOLINE = new Fuel( "GASOLINE", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_000_000).setHeatEnergy(400_000).addContainers(0x2F7747, ExtContainer.CANISTER); - COALGAS = new Fuel( "COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 150_000).setHeatEnergy(75_000).addContainers(0x2F7759, ExtContainer.CANISTER); + COALGAS = new Fuel( "COALGAS", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 150_000).setHeatEnergy(75_000).addContainers(0x2E155F, ExtContainer.CANISTER); SPENTSTEAM = new Gas( "SPENTSTEAM", 0x445772, 2, 0, 0, EnumSymbol.NONE).addTraits(FluidTrait.NO_CONTAINER).setCompression(1D); FRACKSOL = new Petrochemical( "FRACKSOL", 0x798A6B, 1, 3, 3, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE).addContainers(0x4F887F, ExtContainer.CANISTER); PLASMA_DT = new FluidType( "PLASMA_DT", 0xF7AFDE, 0, 4, 0, EnumSymbol.RADIATION).setTemp(3250).addTraits(FluidTrait.NO_CONTAINER, FluidTrait.NO_ID); @@ -184,7 +184,7 @@ public class Fluids { XPJUICE = new FluidType( "XPJUICE", 0xBBFF09, 0, 0, 0, EnumSymbol.NONE); ENDERJUICE = new FluidType( "ENDERJUICE", 0x127766, 0, 0, 0, EnumSymbol.NONE); PETROIL_LEADED = new Fuel( "PETROIL_LEADED", 0x44413d, 1, 3, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 450_000).setHeatEnergy(((FluidTypeFlammable)PETROIL).getHeatEnergy()).addContainers(0x2331F6, ExtContainer.CANISTER); - GASOLINE_LEADED = new Fuel( "GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_500_000).setHeatEnergy(((FluidTypeFlammable)GASOLINE).getHeatEnergy()).addContainers(0xD4F4ED, ExtContainer.CANISTER); + GASOLINE_LEADED = new Fuel( "GASOLINE_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.HIGH, 1_500_000).setHeatEnergy(((FluidTypeFlammable)GASOLINE).getHeatEnergy()).addContainers(0x2F775A, ExtContainer.CANISTER); COALGAS_LEADED = new Fuel( "COALGAS_LEADED", 0x445772, 1, 2, 0, EnumSymbol.NONE).setCombustionEnergy(FuelGrade.MEDIUM, 250_000).setHeatEnergy(((FluidTypeFlammable)COALGAS).getHeatEnergy()).addContainers(0x1E155F, ExtContainer.CANISTER); SULFURIC_ACID = new FluidType( "SULFURIC_ACID", 0xB0AA64, 3, 0, 2, EnumSymbol.ACID).addTraits(FluidTrait.CORROSIVE); COOLANT_HOT = new FluidType( "COOLANT_HOT", 0x99525E, 1, 0, 0, EnumSymbol.NONE).setTemp(600).setHeatCap(COOLANT.heatCap); diff --git a/src/main/java/com/hbm/inventory/gui/GUITurretArty.java b/src/main/java/com/hbm/inventory/gui/GUITurretArty.java index 0b6425f4b..550de0462 100644 --- a/src/main/java/com/hbm/inventory/gui/GUITurretArty.java +++ b/src/main/java/com/hbm/inventory/gui/GUITurretArty.java @@ -34,8 +34,9 @@ public class GUITurretArty extends GUITurretBase { protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int mX, int mY) { super.drawGuiContainerBackgroundLayer(p_146976_1_, mX, mY); - if(((TileEntityTurretArty)turret).directMode) - drawTexturedModalRect(guiLeft + 151, guiTop + 16, 210, 0, 18, 18); + short mode = ((TileEntityTurretArty)turret).mode; + if(mode == TileEntityTurretArty.MODE_CANNON) drawTexturedModalRect(guiLeft + 151, guiTop + 16, 210, 0, 18, 18); + if(mode == TileEntityTurretArty.MODE_MANUAL) drawTexturedModalRect(guiLeft + 151, guiTop + 16, 210, 18, 18, 18); } @Override diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 9ee90e9e7..897408806 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1563,6 +1563,7 @@ public class ModItems { public static Item ammo_shell_apfsds_du; public static Item ammo_shell_w9; public static Item ammo_dgk; + public static Item ammo_arty; public static Item ammo_nuke; public static Item ammo_nuke_low; public static Item ammo_nuke_high; @@ -4292,6 +4293,7 @@ public class ModItems { ammo_shell_apfsds_du = new ItemAmmo().setUnlocalizedName("ammo_shell_apfsds_du"); ammo_shell_w9 = new ItemAmmo().setUnlocalizedName("ammo_shell_w9"); ammo_dgk = new ItemAmmo().setUnlocalizedName("ammo_dgk"); + ammo_arty = new ItemAmmoArty().setUnlocalizedName("ammo_arty"); ammo_nuke = new ItemAmmo().setUnlocalizedName("ammo_nuke"); ammo_nuke_low = new ItemAmmo().setUnlocalizedName("ammo_nuke_low"); ammo_nuke_high = new ItemAmmo().setUnlocalizedName("ammo_nuke_high"); @@ -7391,6 +7393,7 @@ public class ModItems { GameRegistry.registerItem(ammo_shell_apfsds_du, ammo_shell_apfsds_du.getUnlocalizedName()); GameRegistry.registerItem(ammo_shell_w9, ammo_shell_w9.getUnlocalizedName()); GameRegistry.registerItem(ammo_dgk, ammo_dgk.getUnlocalizedName()); + GameRegistry.registerItem(ammo_arty, ammo_arty.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke, ammo_nuke.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_low, ammo_nuke_low.getUnlocalizedName()); GameRegistry.registerItem(ammo_nuke_high, ammo_nuke_high.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java new file mode 100644 index 000000000..7fd5cd5e3 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -0,0 +1,69 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.util.EnumUtil; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemAmmoArty extends Item { + + public static enum EnumArtyType { + NORMAL("ammo_arty"), + CLASSIC("ammo_arty_classic"), + EXPLOSIVE("ammo_arty_he"), + MINI_NUKE("ammo_arty_mini_nuke"), + NUKE("ammo_arty_nuke"); + + private String name; + + private EnumArtyType(String texture) { + this.name = texture; + } + } + + public ItemAmmoArty() { + this.setHasSubtypes(true); + this.setCreativeTab(MainRegistry.weaponTab); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(int i = 0; i < EnumArtyType.values().length; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + private IIcon[] icons = new IIcon[EnumArtyType.values().length]; + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + + this.icons = new IIcon[EnumArtyType.values().length]; + + for(int i = 0; i < icons.length; i++) { + this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + EnumArtyType.values()[i].name); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + return this.icons[meta]; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + EnumArtyType num = EnumUtil.grabEnumSafely(EnumArtyType.class, stack.getItemDamage()); + return "item." + num.name; + } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index c5f5a931b..352994107 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -530,6 +530,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityBeamVortex.class, new RenderVortexBeam()); RenderingRegistry.registerEntityRenderingHandler(EntityRBMKDebris.class, new RenderRBMKDebris()); RenderingRegistry.registerEntityRenderingHandler(EntityZirnoxDebris.class, new RenderZirnoxDebris()); + RenderingRegistry.registerEntityRenderingHandler(EntityArtilleryShell.class, new RenderArtilleryShell()); //grenades RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeGeneric.class, new RenderSnowball(ModItems.grenade_generic)); RenderingRegistry.registerEntityRenderingHandler(EntityGrenadeStrong.class, new RenderSnowball(ModItems.grenade_strong)); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 74b8d2d49..dc174345e 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -35,7 +35,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.Random; -import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -503,6 +502,7 @@ public class MainRegistry { EntityRegistry.registerModEntity(EntityMinecartPowder.class, "entity_ntm_cart_powder", 175, this, 250, 1, false); EntityRegistry.registerModEntity(EntityMinecartSemtex.class, "entity_ntm_cart_semtex", 176, this, 250, 1, false); EntityRegistry.registerModEntity(EntityNukeTorex.class, "entity_effect_torex", 177, this, 250, 1, false); + EntityRegistry.registerModEntity(EntityArtilleryShell.class, "entity_artillery_shell", 178, this, 1000, 1, true); EntityRegistry.registerGlobalEntityID(EntityNuclearCreeper.class, "entity_mob_nuclear_creeper", EntityRegistry.findGlobalUniqueEntityId(), 0x204131, 0x75CE00); EntityRegistry.registerGlobalEntityID(EntityTaintedCreeper.class, "entity_mob_tainted_creeper", EntityRegistry.findGlobalUniqueEntityId(), 0x813b9b, 0xd71fdd); diff --git a/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryShell.java b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryShell.java new file mode 100644 index 000000000..65cbdfc1d --- /dev/null +++ b/src/main/java/com/hbm/render/entity/projectile/RenderArtilleryShell.java @@ -0,0 +1,41 @@ +package com.hbm.render.entity.projectile; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; + +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderArtilleryShell extends Render { + + @Override + public void doRender(Entity shell, double x, double y, double z, float f0, float f1) { + + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + GL11.glRotatef(shell.prevRotationYaw + (shell.rotationYaw - shell.prevRotationYaw) * f1 - 90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(shell.prevRotationPitch + (shell.rotationPitch - shell.prevRotationPitch) * f1 - 90, 0.0F, 0.0F, 1.0F); + + float scale = 5F; + GL11.glScalef(scale * 0.5F, scale, scale * 0.5F); + + this.bindEntityTexture(shell); + + boolean fog = GL11.glIsEnabled(GL11.GL_FOG); + + if(fog) GL11.glDisable(GL11.GL_FOG); + GL11.glShadeModel(GL11.GL_SMOOTH); + ResourceManager.projectiles.renderPart("Grenade"); + GL11.glShadeModel(GL11.GL_FLAT); + if(fog) GL11.glEnable(GL11.GL_FOG); + + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) { + return ResourceManager.grenade_tex; + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderTurretArty.java b/src/main/java/com/hbm/render/tileentity/RenderTurretArty.java index b5d6cf13f..6319df081 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderTurretArty.java +++ b/src/main/java/com/hbm/render/tileentity/RenderTurretArty.java @@ -35,6 +35,9 @@ public class RenderTurretArty extends TileEntitySpecialRenderer { GL11.glRotated(pitch, 1, 0, 0); GL11.glTranslated(0, -3, 0); ResourceManager.turret_arty.renderPart("Cannon"); + double barrel = turret.lastBarrelPos + (turret.barrelPos - turret.lastBarrelPos) * interp; + double length = 2.5; + GL11.glTranslated(0, 0, barrel * length); ResourceManager.turret_arty.renderPart("Barrel"); GL11.glShadeModel(GL11.GL_FLAT); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java index c75245199..b73c3d077 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMassStorage.java @@ -99,6 +99,16 @@ public class TileEntityMassStorage extends TileEntityCrateBase implements INBTPa return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20; } + @Override + public void openInventory() { + this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.storageOpen", 1.0F, 1.0F); + } + + @Override + public void closeInventory() { + this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.storageClose", 1.0F, 1.0F); + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java index d3fbb2d10..35ce9fdaf 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneInserter.java @@ -75,6 +75,11 @@ public class TileEntityCraneInserter extends TileEntityMachineBase implements IG return true; } + @Override + public boolean canExtractItem(int i, ItemStack itemStack, int j) { + return true; + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerCraneInserter(player.inventory, this); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java index 978368386..00ef27391 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretArty.java @@ -3,7 +3,7 @@ package com.hbm.tileentity.turret; import java.util.ArrayList; import java.util.List; -import com.hbm.entity.projectile.EntityBulletBase; +import com.hbm.entity.projectile.EntityArtilleryShell; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.inventory.container.ContainerTurretBase; @@ -22,7 +22,14 @@ import net.minecraft.world.World; public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUIProvider { - public boolean directMode = false; + public short mode = 0; + public static final short MODE_ARTILLERY = 0; + public static final short MODE_CANNON = 1; + public static final short MODE_MANUAL = 2; + private boolean didJustShoot = false; + private boolean retracting = false; + public double barrelPos = 0; + public double lastBarrelPos = 0; static List configs = new ArrayList(); @@ -64,10 +71,40 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI return 3D; } + @Override + public double getDecetorRange() { + return 128D; + } + + @Override + public double getDecetorGrace() { + return 32D; + } + + @Override + public double getTurretYawSpeed() { + return 1D; + } + + @Override + public double getTurretPitchSpeed() { + return 0.5D; + } + + @Override + public double getTurretDepression() { + return 30D; + } + + @Override + public double getTurretElevation() { + return 90D; + } + @Override protected void seekNewTarget() { - if(this.directMode) { + if(this.mode == MODE_CANNON) { super.seekNewTarget(); return; } @@ -78,8 +115,34 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI @Override protected void alignTurret() { - /* TODO: calculate angles */ - this.turnTowards(tPos); + + Vec3 pos = this.getTurretPos(); + + Vec3 barrel = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + barrel.rotateAroundZ((float) -this.rotationPitch); + barrel.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + /* + * This is done to compensate for the barrel length, as this small deviation has a huge impact in both modes at longer ranges. + * The consequence of this is that using the >before< angle of the barrel as an approximation can lead to problems at closer range, + * as the math tries to properly calculate the >after< angle. This should not be a problem due to the etector grace distance being + * rather high, but it is still important to note. + */ + pos.xCoord += barrel.xCoord; + pos.yCoord += barrel.yCoord; + pos.zCoord += barrel.zCoord; + + Vec3 delta = Vec3.createVectorHelper(tPos.xCoord - pos.xCoord, tPos.yCoord - pos.yCoord, tPos.zCoord - pos.zCoord); + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + + double x = Math.sqrt(delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord); + double y = delta.yCoord; + double v0 = 20; + double v02 = v0 * v0; + double g = 9.81 * 0.05; + double upperLower = mode == MODE_CANNON ? 1 : 1; + double targetPitch = Math.atan((v02 + Math.sqrt(v02*v02 - g*(g*x*x + 2*y*v02)) * upperLower) / (g*x)); + + this.turnTowardsAngle(targetPitch, targetYaw); } @Override @@ -90,46 +153,101 @@ public class TileEntityTurretArty extends TileEntityTurretBaseNT implements IGUI vec.rotateAroundZ((float) -this.rotationPitch); vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); - /* TODO: replace bullet base entity with a chunkloading artillery shell */ - EntityBulletBase proj = new EntityBulletBase(worldObj, BulletConfigSyncingUtil.getKey(bullet)); + EntityArtilleryShell proj = new EntityArtilleryShell(worldObj); proj.setPositionAndRotation(pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord, 0.0F, 0.0F); + proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 20F, 0.0F); + proj.setTarget((int) tPos.xCoord, (int) tPos.yCoord, (int) tPos.zCoord); - proj.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, bullet.velocity, bullet.spread); worldObj.spawnEntityInWorld(proj); } + + @Override + public void updateEntity() { + + if(worldObj.isRemote) { + this.lastBarrelPos = this.barrelPos; + + if(this.didJustShoot) { + this.retracting = true; + System.out.println("beb"); + } + + if(this.retracting) { + this.barrelPos += 0.5; + + if(this.barrelPos >= 1) { + this.retracting = false; + } + + } else { + this.barrelPos -= 0.05; + if(this.barrelPos < 0) { + this.barrelPos = 0; + } + } + } + + super.updateEntity(); + this.didJustShoot = false; + } + int timer; + @Override public void updateFiringTick() { - BulletConfiguration conf = this.getFirstConfigLoaded(); + timer++; - if(conf != null) { - this.spawnBullet(conf); - this.conusmeAmmo(conf.ammo); - this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 4.0F, 1.0F); - Vec3 pos = this.getTurretPos(); - Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); - vec.rotateAroundZ((float) -this.rotationPitch); - vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + if(timer % 40 == 0) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "vanillaExt"); - data.setString("mode", "largeexplode"); - data.setFloat("size", 0F); - data.setByte("count", (byte)5); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); + BulletConfiguration conf = this.getFirstConfigLoaded(); + + if(conf != null) { + this.spawnBullet(conf); + //this.conusmeAmmo(conf.ammo); + this.worldObj.playSoundEffect(xCoord, yCoord, zCoord, "hbm:turret.jeremy_fire", 25.0F, 1.0F); + Vec3 pos = this.getTurretPos(); + Vec3 vec = Vec3.createVectorHelper(this.getBarrelLength(), 0, 0); + vec.rotateAroundZ((float) -this.rotationPitch); + vec.rotateAroundY((float) -(this.rotationYaw + Math.PI * 0.5)); + this.didJustShoot = true; + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "vanillaExt"); + data.setString("mode", "largeexplode"); + data.setFloat("size", 0F); + data.setByte("count", (byte)5); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord + vec.xCoord, pos.yCoord + vec.yCoord, pos.zCoord + vec.zCoord), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); + } } } @Override public void handleButtonPacket(int value, int meta) { if(meta == 5) { - this.directMode = !this.directMode; + this.mode++; + if(this.mode > 2) + this.mode = 0; } else{ super.handleButtonPacket(value, meta); } } + @Override + protected NBTTagCompound writePacket() { + NBTTagCompound data = super.writePacket(); + data.setShort("mode", mode); + data.setBoolean("didJustShoot", didJustShoot); + return data; + } + + @Override + public void networkUnpack(NBTTagCompound nbt) { + super.networkUnpack(nbt); + this.mode = nbt.getShort("mode"); + this.didJustShoot = nbt.getBoolean("didJustShoot"); + } + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerTurretBase(player.inventory, this); diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index d45c89c0e..11b8b5412 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -209,19 +209,7 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple this.power = Library.chargeTEFromItems(slots, 10, this.power, this.getMaxPower()); - NBTTagCompound data = new NBTTagCompound(); - if(this.tPos != null) { - data.setDouble("tX", this.tPos.xCoord); - data.setDouble("tY", this.tPos.yCoord); - data.setDouble("tZ", this.tPos.zCoord); - } - data.setLong("power", this.power); - data.setBoolean("isOn", this.isOn); - data.setBoolean("targetPlayers", this.targetPlayers); - data.setBoolean("targetAnimals", this.targetAnimals); - data.setBoolean("targetMobs", this.targetMobs); - data.setBoolean("targetMachines", this.targetMachines); - data.setInteger("stattrak", this.stattrak); + NBTTagCompound data = this.writePacket(); this.networkPack(data, 250); } else { @@ -241,6 +229,25 @@ public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase imple } } + protected NBTTagCompound writePacket() { + + NBTTagCompound data = new NBTTagCompound(); + if(this.tPos != null) { + data.setDouble("tX", this.tPos.xCoord); + data.setDouble("tY", this.tPos.yCoord); + data.setDouble("tZ", this.tPos.zCoord); + } + data.setLong("power", this.power); + data.setBoolean("isOn", this.isOn); + data.setBoolean("targetPlayers", this.targetPlayers); + data.setBoolean("targetAnimals", this.targetAnimals); + data.setBoolean("targetMobs", this.targetMobs); + data.setBoolean("targetMachines", this.targetMachines); + data.setInteger("stattrak", this.stattrak); + + return data; + } + private void updateConnections() { ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 8d4d8faa9..26f12b89f 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -40,6 +40,8 @@ "block.bobble": {"category": "block", "sounds": [{"name": "block/bobble", "stream": false}]}, "block.crateOpen": {"category": "block", "sounds": [{"name": "block/crateOpen", "stream": false}]}, "block.crateClose": {"category": "block", "sounds": [{"name": "block/crateClose", "stream": false}]}, + "block.storageOpen": {"category": "block", "sounds": [{"name": "block/storageOpen", "stream": false}]}, + "block.storageClose": {"category": "block", "sounds": [{"name": "block/storageClose", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, @@ -168,6 +170,7 @@ "turret.richard_fire": {"category": "block", "sounds": [{"name": "turret/richard_fire", "stream": false}]}, "turret.howard_fire": {"category": "block", "sounds": [{"name": "turret/howard_fire", "stream": false}]}, "turret.howard_reload": {"category": "block", "sounds": [{"name": "turret/howard_reload", "stream": false}]}, + "turret.mortarWhistle": {"category": "block", "sounds": [{"name": "weapon/mortarWhistle", "stream": false}]}, "entity.chopperFlyingLoop": {"category": "hostile", "sounds": [{"name": "entity/chopperFlyingLoop", "stream": true}]}, "entity.chopperDrop": {"category": "hostile", "sounds": [{"name": "entity/chopperDrop", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/storageClose.ogg b/src/main/resources/assets/hbm/sounds/block/storageClose.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c157dbe7cade772d47f85edfb87f186cb024637f GIT binary patch literal 4369 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 Fe*i7Gq$B_U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/storageOpen.ogg b/src/main/resources/assets/hbm/sounds/block/storageOpen.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cee45c0083a644208b5fdb9a58a52061c8c81034 GIT binary patch literal 4426 zcmai2d0bP+7M=iNSfoKB1dKLlA_PGR1|(J#un36;;lgD#f-DNgC=jDii$)SCMx`_c ztdJtLL;*oXAu3c{Ktx$Y5zr!Nr3D1FzWOS(E`4)vgh&5)zc;_h+*!W)=FFKh_nez` zn>PmmJ@7HjEkCjqtGW%ZQxfJ9c5Y9JNfcupgwHFm2LMUt1pIlCunwC!nXsAIh=Gi_^PObAX+P4I*A8>XzmHp~IPL=y`!bq@h zm?rzwT(S$Y^xFXel>vwLh5gi*xgRnTdCHfsE@qZX@69 zm1?P5gYM;*D>L+JrpQ-&K?w{w7s>J#uTmSi1BdvjoW_ou1#$r>K5nl#Zf{JoIcE%- z0U&t>l5ZwcZ+%0(RYf%+&Iq3dl>vwl=cg#~%lXAmNe@>t@I1J`+_B{xo?YPvWO@d-5JBKLGs?Y;c01V(V>{UU_eN~^|2}XOgqTVSvGC$rL zpAL0Mx|g`A%rM(o-`WsA2PlTrT;bd(olvrr!ZSN=RLOa)9w-hsE8tae=BWK@(v*dY zOPnFKxc%0kn$-?#$JODc1rRr+ZY&Nr*46B)(mDzpu)gH>XVGf&CRkfgnU-5{s0P-i zRVL;Xtf_)Eze{OI;To(@j8Wmm$c<-IwFTBJy?iOZu;T`-t!sMLuO>}Ga2&2=xL;3F z)}f7$n8bTS3AEMbF*YvGyvBx|jcjCU?~%L12_>p!L`GgR!n4yUTn~5>Z8OP;-$W6U zZJR|&xy?LToWXM_D?NVDrN!}lD_$&nUUA;+GgDS0Y1P8YMkGk&+8ri*$r&n;Rfj|f zD{BxQQ=>wRasAPt?!67I<8lKr=9p~eNp*^`L#a-kH0)>qSob^iuKAq*=6_M|m@@)r z!tB)P;@TPHgG%Ci@+ILH(jy;a3dYj=U>=uj49kxX|3}ts9bRx6Gs{f(xU~>juttT;}Af?AXrkINL7@jDoRsxhO?CkNApX|3Krfz@x1o*=>N+mxPj9F z*g^MAq5C3q9|Tr#?Mh8C?NS?9be|N*mV0d79`9OsK!t|x(7iN19smHQx6YDV?o#

>KIBh}U%HaJzFx@z_j` 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 KP)DBz@BaXj?U055 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_in.png b/src/main/resources/assets/hbm/textures/blocks/crane_in.png index 9fd5029270c681fc90c1fa7faeff18884349c4b6..8eb25f50217cc7ffc1f328b4d9144391059604ec 100644 GIT binary patch delta 261 zcmV+g0s8*k0kHy*G=JzxL_t(Ijir-Ij)fo)MGqZjvYNLJhpxmGxjPf169b8WKo4G^ zQQxn-?*ysTJ*f*Q`o2&6LlWS2yB&%trLxxFSwaY=X<{75I{;vw=VGXhH7KQo5Tewr zwRga}t^f?f@X^>^*Bv9o7zrT&ptXK!R!R|L#5s2a#28D{Gk%Ct3V?mzOTPrzw(XGl z5hR-dLI?%$1zZj-%NT<(=2Fl7TI-((f0fL{M{1hpb3lE+aLjyGedy9!%Xx}d<_qAr z=CcaGdr#Z8muYgmTsyxR3E;iQId?JEs(-2&W7$i9Wm(=n;b-~=@_xsC)Eux?j=`}@&iJ1Zm3 z3y|?vYklGmJ^F!&wv1*r0Nu>YDYL4Ah+t-;17=2REd>w}sOsn-YHg;^Q7?cMB-&F5 zh#<2i-)8^-aCf-->d6|A(R2g=D5d-k$ObC}?4KT diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_in_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_in_side_down.png index f0374fbe7023637a45803160f3c9d5d12149d3a8..9057604d062747565453a9bcac0e20cece7613ae 100644 GIT binary patch delta 379 zcmV->0fhd80;L0xGk*bGNklS5P-j}1&!B2X+e4vL{#Wo^i3?i_2eV? z0JimYdJ#N`3X15tkT$eElu(kz?08tSZqf*X14DLZXTJH#s^M@b{6p#h-EOzw6cP9J z&$%e2h@yxv3@rd)xm>ygKhXz?2udmEPt()_Hk%CqT5F6km4DT%0B!_h3|W?8jH&FR z3ZS(v0&@Lr48OBH)&Y_vaTj42783mqn$0GF>(&9vRX?sKHgF4jhZYia;B0imd_H$^ zaU4_2+smuA+ii}o`ve`EoNaA#Z#-hLSWuQ)dE)@BR*R$lrGxawBUiaBZUm*&4&>r? zf-%Nb&I=Wmm~^IT;nD}?iN3E4P=EwM!1f7{gxbk>&>I*7^;6rCezEq!xwU6gxPQ+7 z()+%Az9L{XezfY_n};7ex^I zv*E&=S8WzVi>9G+WqA^>=tZvfO4?Dkz2Cy*97Wm$gBPEl6ST64Nzh?5SkD>pnV z5Xs>>NL;XU1(Bph4&a0r1;0S40B8W3XCEB9*QbBId%-`j^nqOCrepdH)>aEzYDY1@ SH$Tk)0000*G(xu?Lx*4iLg62=&ubBuf# z3ct^eTIPbPRUipT{REQOuX2hkCrOfS0!b8E&h-M-5q68^Pf^K-z{AxM#uFZr?d-cG zeh;j*%s1QUjkNh?cTBg^aYuy0%JWme% SeTb|80000hGk*aiNklZpiX1>|odW!cot07m zNGTI#-WQ+%xZQ3E#9E6|il6t2`cP4pC2=CJHUO5go2H>YRG14~kMRBS8X&RXFbp%m zO9yD%mika}J;K8y0rK_y#&)~S??F5=DJ4&zA9ovh7a)X4RQUI@d8;OlFD02` Ut8mz=IRF3v07*qoM6N<$f}$^tQvd(} delta 210 zcmV;@04@LQ0{sDyGk*ZINklF()EUw>6qRgWK}{2(GpMd#cb;LBR;s4_{22%K}syct^_ zX0w@Glx6`WLGn8QNn8&GO>L0pc^ZHun%dxg1G*Nt?8`~W2utA0T??!?ctOtF5=Bvr z0BUGxt+6{DCs$qs0D!eN8t~sUCIOc29V*N!;Q1ILk_7p9rqD>$1M)dUnI_$mp8x;= M07*qoM6N<$f(+SNF#rGn diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_out.png b/src/main/resources/assets/hbm/textures/blocks/crane_out.png index 6a296ab4c9a303344558e599fc2bdb15917db9fa..98f5652c1750e14d588c201873832984bb1d6e68 100644 GIT binary patch delta 208 zcmV;>05AWt0sH}wG=H;6L_t(Ijir+@4ul{OMIVOJyO?+v&tUI0JfpRViH)IymU;*m7J`9S8wrM|NjA5E4#&O&Y0Q$by3C=mnvb@x7+v2_7 z4VGomK+2W&-hYn}LeRi43;JkLLOxZ?v#ERer8wIS000000< KMNUMnLSTZ~b6^_) delta 133 zcmeyvxQTIsNnNI=i(`mIZ?ccK_wVx#j0uf~6%`d8mwr4wE#AUtV`IZp{r#QmL>Dsw z>HGKZ&wqG&x;}@v!fY=c`J>zh1>fJrvVlNtZS9^KiG)MX?1K)hU_5-9p(sd^nb}13 l&?PfX236ySn;Qif7*y=dpYA?6F_{4fJYD@<);T3K0RT-+Gv@#R diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_out_side_down.png b/src/main/resources/assets/hbm/textures/blocks/crane_out_side_down.png index 0b77746b16a6fde2d3b165a45f50717c0ac6cfef..c0fef9e9b21efb47fbaf1d29decd43c9f7411195 100644 GIT binary patch delta 373 zcmV-*0gC?p0iOeqGk*bANkl6FVHkT zh%ewp@E|HE;#CT1L)$|LC0Xo_hwZMLw1VKkke%6?|Nm#QYCIkb|F9-Nzu&JUMZ|x@ zvooa>X_}HGi3I>yE|zv$%OfQ?(6bA zr{Ux|)?Tm2)o@s8J^`jt#A30aZjJiJ0lM8T*MkA4yXM;{^2~MfBPgZzKyKm~V~l5Z zM3p6$Wm&llfo@!5n5zRQKw7O9n`b}@8t1#BcQ6K;7gmvewej(#jc0f8@Z$c`$B}%! zAz(d!vL43S<4>I4BeOeuR-@5K+U+)4>%I3MT73i&VZC14C9YO0@;u+$@L%j3p$1~0 Tf`yqt00000NkvXXu0mjfY96w2 delta 210 zcmV;@04@KY1N{MzGk*ZINkl|>jkLuUP1E%3P$eIw)Fv>5Fcb)^wa$XQ_b84b8A~&Q4+(g&KuRvgaE$OZ z0Vh|GlFnLyB)nSi3ltSV576JDQGec?`SFYe|G+XAa*ex=>D$<g^P zKxMHrg%pp zmSx$xcW+S?)oXU&1PH)(yIpoKfGvow4n-ee40NttqkePw`HjmLb9j99(9bjb{f-6a z>e+di=TEG`Z78q>0w;3FHukM=_k6al=(=uV1FE<&#;g*0@81SdY^}`_OTrj~_ntD6x#I8K zav?7Ziw2UAv}jPx9Z2HT_te1P9OF3V-yn(~z!f;OEltzp8B9px9K^f8)xdGaZt~5JjI6RSv*X$3nk?j<$k!_$!zJ#!>nKyrCEXuO9{6i@~Q53 z0TO^|ngWP11}P=?s^U>qWLbt^$hqABvF*C9xmOiGz&G%5y>1XcZXCxI;H(2QO~d1r z{Pr5uJMekCak*TGmBu^H^PI2e^K_7>03k%+!ky#c?S?qd^Wol|k|YUs9|LwRoPl6{ z!iNvZTFbI5XfmyLiE(?basXJC1*Oz3(UQ0`vipGk*Z9Nkl#bjAv^)m?3~LoOTx?uAyCC&uK7K;+Q`e& zCO{IBHUah8g(ObHKm&~4Gfh+e3!?c7T!2H@(Y9?KKoaNKyh5L24RBn6e6--4WAr{* zEv4iito57Hf5%t^_%`pQmbo=N7Q@VnATP_b43z2)rSm@?kGwz!00000NkvXXu0mjf DDBD^~ diff --git a/src/main/resources/assets/hbm/textures/blocks/crane_side.png b/src/main/resources/assets/hbm/textures/blocks/crane_side.png index 5a9f906a64f10bbdfcd63e0d2f2eafdc9ee6f3b9..d2c2e004148a8d4c13d259fb6dc69870d6af9376 100644 GIT binary patch delta 307 zcmV-30nGle0o?+SGk*aTNkl zAvDB|F%dIEDHZOmwVq&}X8?e64n&lFJx35$AR?^m3L?r*k$)p_&TR=K_ST3eliEPA zEKB&2HpT)Ow@hM8fEffi;dkRA7kQWQr8IU!T%+<1c2vRFXTKwE3GuZ0)1 z-VmiOC;(iRCB9w&@B)4JQ}h840mZ#E{h!-@$+nbM_JE^Yd@s zKY}kOe^yP?a4c0-aLyenAFn5_P1EFE7{?LDn2Zm9;~U(uR+p(bxPJfu002ovPDHLk FV1l~)iYEX7 delta 132 zcmV-~0DJ%40uj5qrQ6DvZ079P=97|!dA z+rVy^?I2aH7|;|8Gk1aReij5QA}QF+z|3%WlnAr%{kA;ZrSunkqJRKY0H{j~=3{33 my0wBgaCnMu9D1f}(5oF+2PcC;SKH$N0000$npw~1Afp+e@B0bx04#^kJ5c1Ff9Es zEcaZ!AJ6$KvNhWddlf~IgkebAwu}4k%KfRVwTK91Sq?)iisI%KzN8;&3D_U|V|^R| O0000V2ZVF(GA;wrU zXrIgh@K0W<2B03fCOA3ZQTSWUpnR0^N~lmNH; yb;{(urv!LBH$Vv+?eacXVzF=Ip=J7fSk()U^gCoczq73X0000rUCle~bJBc`KQvd(}07*qoM6N<$g2_dSI{*Lx delta 155 zcmV;M0A&Bg0>=T6G=F|cL_t(IjqQ^$3V<*SMPJ1+2XX6BdW+t&_i*U}1jp=k&|n1- ztB(Gq`3ZR>(6|_5;e~n&M5L)vRd;}hkWxAnYv7p=A)u=J1U2=pKdfNNIRoImzx1Z= zY`+%$fG+`0{s4dj3P2gR#IU}1{4{TXC(Y)aUE`}`suQhR02C62N*0kR;aecx+Bo7jR>6+~3eQ%X1BJWl`s zGebn&>K>quAR;KGKt$XwJODHI0DGRsXgjmm3b?MT{umQm18*(Kx~+gW^PV=Ns)#Wn z7})}B#wXCI=`FxBa#ZlzGmR^24KxozO3AHOD}>O2+%0&w&Kr%0{EMWj$T_2w@|9?p wXIy0m$T@?VU!8BeYPU84z;PUiG2$0}05By(=XQ^sprl6-u)C*Vk_NyeS&K3YzqjpUm&z7w!6G1;hURTIyB`BUNwPfCTvT%b XOS2sdEpFvZ00000NkvXXu0mjfbyF|G diff --git a/src/main/resources/assets/hbm/textures/gui/weapon/gui_turret_arty.png b/src/main/resources/assets/hbm/textures/gui/weapon/gui_turret_arty.png index d5a91504e451481d5fafc7459a175ee042b7ac18..8957e7333c7a45b19afe64a063800fd84ab3ff4d 100644 GIT binary patch literal 4645 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 Y9s13i<)7*Q{%|MCz(T+Libu?U0X^DnRsaA1 literal 4431 zcmbVQXH-+&(mn|Z?L~wrO{5r#8W9CWgeXJ^LIjZx(tQyrzKBQ(JwZ^KQWZg}^d`MV z2v{J1(u)E@kQxv|H-SL-!uS38e%v4T-o4hW*=P3bIcuMpd1m&BG|<;R!hM1p0DvPH z9kdYufLK!yz{$>H)=vr_uo%Qs17pI;8iAbmBLIM(9fQ7M;+wWIVHY9rU95GT{QBlg zm-==K4f`3{qux13tLAU$7&xzlez>QsaJi`T=xtj>lHd!@QKB?;>`j?{j*Lmd)1qho zsYZo_Pm@8;e8+Wjzr2SeDrsaZ8DaK}UG(&f3XWoXy?uO`6DgN2In4*E8&Ij<)W(9u z{r!1mr=GMT3^6UO<>*ey+>T?=Lo+nKU{7L2HUphUQtPj;vTV!Q7i*p}-lQioa_lIp3kpse*?e$;vgV=XA zeloyQGVEnPXi@CM*Xvw?j8Yu_z-e*GA`?p-i34t(>E+Iv`!rMpCkm?kz-?9W{CS_S zOYi)d*t+&7#gV?IvnRFT21BWF2H(F&mxvj1Rr26fPDHJA@_U@ru6tyC?Du9&j4>XD z$OQv6qN0KeYd$-_i=yH1ZuG?~CmAy)0IGAp%wu4CQ)UOVTKpr^kq0=_=mVaN<_6AG zzTa-i+r8!hptugtoqyz^alI!4=kxq&`a!v&h_R4+N1Y9aW_{$_Gt%(sKqYhYH)!-M z64z*sMyvVFTh96zj^B@j;0Fd3j~UDeQj>o;dSRnTwLj)zJ)~PW{Z8#dP5Y zAAplE2H-xT|LVpz(n~p|Ys-61W1IJ-z{E3@-?D@NT~$852(VLaM*J9EtRxAs-#vEm zg&nx!Z&2^tZ|w26kgBxHIhrF3?bo}iv6DR?tTi_XLC zF%9DQ)|61E&q1!(I<4C4Lq~UktmDUb;&&exYClp_8ZBm@eoQ2s8$Relc=2R){pDMn z;@GU|@GO%zxgoQ9O#LpTrE01#JtsK!aw5u_Wjchb^^1BJVxTeeO;E`NZ&8WW@zcr~ zK`2f42VWKGTK8{us;j7+)g4bh(JBlee$50ijDnaib>GZ}XRCwmi|s{W`7X*Mfavp! zwkey+Z;`upW_QwT&fnpQ>KI)l+o+Qa=Qrt>b$}%L+=N{ZeLt^vGkqs%__o5>1F#W@ z9_{J1g^WG_bpegG#cjUt=$&`$jo*aBtMXcO|D05j*gX-hyw<$B@S3yA5`3;luk|V; zN&(Mj$Yy#27w5Q>cGhGK%L?)gsRb#!;kxGQOzn}ZDcYk%Z&=5!_)cL8zB^Qt?jj_B z3TrtS#c`E}?A_jNZKW4{y(P@8%vIAPe}N{k^eG zL3Kv&I>aytE}zFN%wbJ8#80bGUTt6BV1dHivya17AA+rSM@r+UJuxEz9v9j9G~X7K z%f{b-VD8|Rz21iA@D-)8D9Nj*rP!BP2-yvv$JP6JvMa z-9duNbge=F4!s`a{r5uRyUY?+V#Lfu@Ytn4a*iKzt?kINCfLm8Uv~0|yzJ!H)>u~Z z)UK9{yevCI(hm6YjlSn&}^x=JFrZ^E&dy_M6l;5 z1kk)%>lx&9Zpr7lckFHx%&ZbpY?hAOv)rT@yzKSxWR}=y?_bXD;&_)3@te0L#FurM zSv``2y`pP2e%k3^J)5Tf-POsSU{7M*W|XhhL3yHDkW#m$+e*)}5nC|ztINtar(T>< zTuYYvWCL!6og;!8P?-9Hf z-pvXp8WwpFef3+|+L%4e)0T)v5EXO2yk#fppRtN78%kwO+WQ4_b^00HTZevfL9qY%5AE3;#edIa5Upd^f2r>?zJ~;yc(qS2zsw=xZhEu%a-uIeD~?s8h8t$Fn9c?6zs75B$>WWS?rS3Bbh92D{M zuD5cuh$n#s)=A8p#SOx2oQ8}CBNG+I@w$nmd%A1U2B5Gf%v5jXWk=(YAb3M;96t1rGz5Q8{an`d^w@! zi;)DYN}hqq^9>6fext+9M!HDHV<~{(1zWjTxnR{;qHu50lu)B*j?vu&AR$r@Sm;T= zG%sj5IO~z=Z#cw#O*+KY0aFp?RpvVr{PPXh%4{Y0&g4k5uLW9q<8Bf`&0MgQ^HoBO zfP3AFseOYX*=8VzV=Nc=oF}hY-*f&P@Ov zmQ`LAnSRF==~Qlc_=zFK1BoGS1yYYog!kYk030U1OvvPU@wfDmsbY4b29)pVl=iS8 zh%^@r4Nks&?^Uv#yUi~fILzZsapNI^NiZVJ6dzkZEh^&y2i2AkY8KhQQq?M?;ME49wsY4PmTMC=?y=(>?Gy- z6gR;6_O#3Z)t>0OEo`3a=k6M2a!ta~bKq{XZJFkQzxnzksY?3;?23FGT&))oYo>~l z{F1tsFg#)JU3HE8Ak8TR9hXL)z)@+_8NBETEsJM^QA0Fvve(LBE>ZedeGL}t6kaFO z0xCBVz(;}#0^)k5Sxt!n*Ow_Z#R3sX=_h`*ThrXFU#86Us8+8ka<0DyymVgyU3~VA z6bEanlsX1b^$=)9O-j;|_Ls;iVi6BCMKW(@b7%1^{9vgF)A-dXP%Wo zz89Cp^I3wDeQfVr;`FRKNi_l?dcW@ox8SjvU=veka9^!av3&kEspfT{o)v#b4Ku7# zW~!OxC7DFC4FwM^$-&*w6k!Ous3?ACVtan|M!8?D@fB&{_$T)Xw%OPcpd%g21Xqhi zCn7-0Do-X04gHcYIB&o(S;8i)wSaWZ)v@pnAqSwtrf)1-E^T-fUW6PF!D5r_dV4p+VtfEWxgM|63U2cq`XW?!xD97fhjP%9Lz~ z+i&__Kp)l@N0a4S-?2fOg04F866L;rUyazqGa_6+`R|?l^?p`J&SlIsoZL@dB{zLs zp*2&l{LDO3e6uE1YVhOHS6U8UD70PM67SWv_)*YF8sjM}l-z&4G+~WtB`ct64l+<> z#M&l(B$~oIpMDA$+GbiOrhtC$PcRy@XiWv8!7OZ^H{!}AaHDpP%)+Y&0R%9MpgghD zFA;?v8Q4iLXSi9Zd}BjVpU#73rJZLdR;z60SVkb6mcb4V077_~d~! zzMX=Xvun|0)kgx>U#0^0sS?-aG-7%vXEnA0{cnB_lkOB_WGX9hpBx);30oY$T&Lf1 zQRKh>LzlX*g~|f0CR9kDuo!1xLM*Enz4a((2BT%o zj?Qaj>#A`ZIr6eol|P>F&0ip8KZAV5g>|H}9vPGz&s6gz(kdiR$GO$NJ|(%#wrLLm zklik)Jvc-Pmd3HVZo)f-1F16e)+<&V=HY54(uH9{{PAHyBRf+t7;tOl_3nC#dzhGC zP@N%2E@8RJ8V;U}Epzjd1Z54$8u5bt*?wHHhN2c9ix@~e;$UYX+#$;SdnD+uoE4)) z4;6=MA#0A+rx%*~#97a-w7O(YRk?h&9Ig8;xzeXU?bD#EgiHeif(|$MT1kumaSt@Q zY_hm><^s`tREeVy03=qe)1}Pahwt}a)7D?Mo=^MHSekH$Cm#%G6iQ3NvlCFS5nxvB zA+^U}s*P1k6rxx8j6e<)-Kb{Kpt6Kk1&w5`0?C`=9_T%c4e4pvhJ5LU2YT`p4w)4$< zT#3fv27cT9&&XPm1XDvCNB@hg5TbY*1Oxa&PaNf2mkRf=cwgoI%o#t~Y=vF8MsOh}Gb&_tMvFy8@nU{L1!^B=Pr&c5*kumxzoT?i{#3W__gsZr~%#_V4-rU&ROuUTYizksbP!C=@=@f?r2M z9|T0l1OG?Qc)?YOiz~@}F<4W3%ID(NLtP$yr*LCdQz89dQYp6{vb{cZxdL(VR=8=% z_OIhWg)rCuQeJi!j`FT2Gp(HhAcgWi38Va}=?koTI-*nxh2#vr-h}Ksn=6E3a0avf far}oPF8+Yc#I04fT)%(ja4SYjA6=$l|MY(Vz1ub0 diff --git a/src/main/resources/assets/hbm/textures/items/ammo_arty_mini_nuke.png b/src/main/resources/assets/hbm/textures/items/ammo_arty_mini_nuke.png index 7aa7f75a0b304db12f1292faab3598ab604c447a..5c0bc91c0d31e3e889f2c92e96e8e5ce87223676 100644 GIT binary patch delta 285 zcmV+&0pkAB0>=W7Gk*a7Nkl%_@GRaIkA6qIF& za}HoNw3!Z^b7-y6T2t5cXw1X73NXe9?|qWcS_5!>d$oup6@Pf|vDU`%c6)}*B=^nD zQ6vJ!7%@fm`wRe?NmQZmfh@Tcasg?Zsx*w&pCGn{#g;g!{dDb5a)TFzDGv` zhND3+)?lngoCjzOI>{fzd5qNnESGlypx1lb3u*zxvqdCM3V)4u`xJow&2=~k*eVdj zd7htC22olu91UtA1$l9N8vwdplPMTa)@Y*;C&aTw$xdtc0${ZgHk%*DlQriTXBew7 z)>JAf5%Zp}I+t0fiA7&hQkigmQo7zcNTr4Rgf!SKFtL*=tpqfID4lGo7H|lX0vbKn u-AugvGJpAq8X*IqxSg-h@1s84-ueR=M{$gUM#_@_0000