diff --git a/README.md b/README.md index f86803200..db2e42f5b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ * NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases * NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases -* NTM WarFactory: https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-GIT/releases +* NTM Community Edition (WarFactory): https://codeberg.org/MrNorwood/Hbm-s-Nuclear-Tech-CE For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases diff --git a/changelog b/changelog index 0a9e331d9..0ba796cbe 100644 --- a/changelog +++ b/changelog @@ -1,58 +1,17 @@ -## Added -* `/ntmserver` - * Functions like `/ntmclient` but for common settings - * Can toggle `DAMAGE_COMPATIBILITY_MODE`, off by default, enables a more compatible (but slightly jankier) version of the bullet damage code - * `MINE__DAMAGE` can be used to adjust landmine damage - * `TAINT_TRAILS` now replaces the hardcore taint config option, making taint blocks more potent and the potion effect trail taint blocks -* New ammo types - * Explosive 7.62mm - * Explosive .50 BMG - * Explosive 10 gauge buckshot (unlike 12 gauge which has explosive slugs) -* Lincoln's repeater, a b-side to the lever action rifle -* Weapon modification table - * All weapon tiers have generic upgrades for increasing damage and durability - * Many guns have specialized attachments. Some examples: - * The assault rifle can use silencers, scopes, can have its stock removed and has two different polymer furnitures - * .44 revolvers can use scopes - * All full-length shotguns can have their barrel sawed off - * Most shotguns can make use of a choke to decrease projectile spread (does not work with sawed-offs) - * The grease gun has a modernization package, replacing most parts and increasing most stats - * Some guns have special mod combos that will change the name - ## Changed -* Fat mines now use the standardized mini nuke code - * Fat mines now have a base damage of exactly 100, being identical to demolition mini nukes - * Fat mines now gib affected entities -* IV bags now use `setHealth` operations instead of dealing damage, preventing health duplication by just avoiding the damage -* The settings tool can now copy and paste the "paint" from paintable cables and fluid ducts -* Changed the way taint works - * Instead of neon purple vines, taint is bow a greyish sludge - * Taint now actively replaces blocks instead of growing along them - * Taint is still limited in spread, however taint spread is lower underground, taint decays three times faster in intensity if the block is not exposed to air, making taint spread more along the surface - * Taint has a 25% chance of splashing down when replacing a block with no supports, causing structures to collapse and taint to spread faster - * Similar to soil sand, entities will sink in taint and get slowed down - * The sludge consumeth -* `enableGuns` config option now applies to SEDNA system guns, simply canceling all gun-related keybinds -* Cinnabar dust, if registered by another mod, can now be acidized into cinnabar using hydrogen peroxide -* Copper wires, like AA and gold, can now be welded into dense wires -* Removed the crafting recipe for the small geothermal generator and ZPE generators -* Removed the gemothermal, ZPE and ambient radiation generators from the creative menu -* Disabled the horrid flicker on the quad rocket launcher's antenna, making steered mode look less terrible -* All non-legendary .357 revolvers now fire a quarter of a second faster -* Changed the detonator's recipe to be less archaic -* Crates can now be opened when held -* Crates will not longer show their contents when locked -* Crates found in structures will sometimes contain things that aren't items +* .75 bolts now work as advertised +* Updated lead pipe texture +* Removed recipes from a few ancient melee weapons, as well as the creative tab listing +* Removed flat magnets +* Taint should now also affect non-solid blocks that are full cubes +* Reduced the AoE size of 7.62mm, .50 BMG and 10 gauge explosive projectiles +* Removed the old gun mechanism items, turrets now use the new cast parts +* A secret weapon and its variant have become craftable +* NEI now shows RBMK fuel rod recycling and cooling +* Removed most of the old unused siege mobs ## Fixed -* Fixed animation errors on the MAS-36 -* Fixed drone docks, requester and provider crates not dropping their contents when broken -* Fixed all missing texture errors that appear in the startup log -* Potentially fixed a crash with mekanism during the recipe change phase -* Removed the coke to heavy oil recipe for allowing infinite oil loops - * Coke to syngas and coalgas recipes should be fine though, so they stay -* Potentially fixed another issue regarding NPCs firing belt-fed guns -* Chunk-loading drones may or may not be fixed -* Fixed disperser canisters not actually despawning on impact, endlessly spawning mist clouds -* Fixed issues where the new packet system didn't play nice with machines that are being sent packets by other machines, like watz segments and radar screens -* Fixed fat man's piston not being extended correctly in non-first person rendering when unloaded \ No newline at end of file +* Fixed taint destroying bedrock +* Fixed ferrouranium plate not being castable +* Fixed bayonet not rendering properly in third person +* Fixed xenon poison gauge in the RBMK control panel not showing up on colums (oops) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 7e329bde9..f2f5fe3b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5257 +mod_build_number=5279 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java index 196d8a490..364d3353a 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java @@ -11,22 +11,22 @@ import net.minecraftforge.common.util.ForgeDirection; @Deprecated public interface IFluidStandardReceiver extends IFluidStandardReceiverMK2 { - + public default void subscribeToAllAround(FluidType type, TileEntity tile) { subscribeToAllAround(type, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); } - + public default void subscribeToAllAround(FluidType type, World world, int x, int y, int z) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - trySubscribe(type, world, x, y, z, dir); + trySubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir); } } - + public default void tryUnsubscribe(FluidType type, World world, int x, int y, int z) { GenNode node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider()); if(node != null && node.net != null) node.net.removeReceiver(this); } - + public default void unsubscribeToAllAround(FluidType type, TileEntity tile) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { tryUnsubscribe(type, tile.getWorldObj(), tile.xCoord + dir.offsetX, tile.yCoord + dir.offsetY, tile.zCoord + dir.offsetZ); diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java index 411f91a77..3283c6489 100644 --- a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java +++ b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java @@ -88,9 +88,11 @@ public class FluidNetMK2 extends NodeNet= 0; i--) { - long toTransfer = Math.min(fluidDemand[p][i], fluidAvailable[p]); + long toTransfer = Math.min(fluidDemand[p][i], totalAvailable); if(toTransfer <= 0) continue; long priorityDemand = fluidDemand[p][i]; @@ -102,6 +104,8 @@ public class FluidNetMK2 extends NodeNet node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider()); - + if(node != null && node.net != null) { node.net.addProvider(this); red = true; } } } - - if(te instanceof IFluidReceiverMK2 && te != this) { + + if(te != this && te instanceof IFluidReceiverMK2) { IFluidReceiverMK2 rec = (IFluidReceiverMK2) te; if(rec.canConnect(type, dir.getOpposite())) { long provides = Math.min(this.getFluidAvailable(type, pressure), this.getProviderSpeed(type, pressure)); @@ -56,7 +56,7 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { this.useUpFluid(type, pressure, toTransfer); } } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -71,9 +71,9 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } - + public FluidTank[] getSendingTanks(); - + @Override public default long getFluidAvailable(FluidType type, int pressure) { long amount = 0; @@ -112,14 +112,14 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { public default int[] getProvidingPressureRange(FluidType type) { int lowest = HIGHEST_VALID_PRESSURE; int highest = 0; - + for(FluidTank tank : getSendingTanks()) { if(tank.getTankType() == type) { if(tank.getPressure() < lowest) lowest = tank.getPressure(); if(tank.getPressure() > highest) highest = tank.getPressure(); } } - + return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE; } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8ea4d1a27..d86f1dd15 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -275,6 +275,7 @@ public class ModBlocks { public static Block part_emitter; public static Block deco_loot; public static Block pedestal; + public static Block skeleton_holder; public static Block bobblehead; public static Block snowglobe; public static Block plushie; @@ -1464,6 +1465,7 @@ public class ModBlocks { part_emitter = new PartEmitter().setBlockName("part_emitter").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":part_top"); deco_loot = new BlockLoot().setBlockName("deco_loot").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); pedestal = new BlockPedestal().setBlockName("pedestal").setCreativeTab(null).setHardness(2.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":pedestal_top"); + skeleton_holder = new BlockSkeletonHolder().setBlockName("skeleton_holder").setCreativeTab(null).setHardness(2.0F).setResistance(10.0F).setBlockTextureName("soul_sand"); bobblehead = new BlockBobble().setBlockName("bobblehead").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); snowglobe = new BlockSnowglobe().setBlockName("snowglobe").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":glass_boron"); plushie = new BlockPlushie().setBlockName("plushie").setStepSound(Block.soundTypeCloth).setResistance(50_0000.0F).setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_fiberglass_side"); @@ -2608,6 +2610,7 @@ public class ModBlocks { GameRegistry.registerBlock(part_emitter, ItemBlockBase.class, part_emitter.getUnlocalizedName()); GameRegistry.registerBlock(deco_loot, deco_loot.getUnlocalizedName()); GameRegistry.registerBlock(pedestal, pedestal.getUnlocalizedName()); + register(skeleton_holder); GameRegistry.registerBlock(bobblehead, ItemBlockMeta.class, bobblehead.getUnlocalizedName()); GameRegistry.registerBlock(snowglobe, ItemBlockMeta.class, snowglobe.getUnlocalizedName()); GameRegistry.registerBlock(plushie, ItemBlockBase.class, plushie.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java index 079058a64..c82d2526d 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java @@ -19,6 +19,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; @@ -46,7 +47,7 @@ public class BlockTaint extends Block implements ITooltipProvider { if(Math.abs(i) + Math.abs(j) + Math.abs(k) > 4) continue; if(rand.nextFloat() > 0.25F) continue; Block b = world.getBlock(x + i, y + j, z + k); - if(!b.isNormalCube() || b.isAir(world, x + i, y + j, z + k)) continue; + if(!b.renderAsNormalBlock() || b.isAir(world, x + i, y + j, z + k) || b == Blocks.bedrock) continue; int targetMeta = meta + 1; boolean hasAir = false; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java index b0ccc6634..233f8da71 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -20,7 +21,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockModDoor extends Block { +public class BlockModDoor extends Block implements INBTTransformable { @SideOnly(Side.CLIENT) private IIcon[] field_150017_a; @SideOnly(Side.CLIENT) @@ -234,7 +235,7 @@ public class BlockModDoor extends Block { } p_149727_1_.playSoundEffect(p_149727_2_, p_149727_3_, p_149727_4_, "hbm:block.openDoor", 1.0F, p_149727_1_.rand.nextFloat() * 0.1F + 0.9F); - + return true; } @@ -311,10 +312,10 @@ public class BlockModDoor extends Block { } public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { - + if((p_149650_1_ & 8) != 0) return null; - + if (this == ModBlocks.door_metal) return ModItems.door_metal; else if (this == ModBlocks.door_office) @@ -396,4 +397,9 @@ public class BlockModDoor extends Block { p_149681_1_.setBlockToAir(p_149681_2_, p_149681_3_ - 1, p_149681_4_); } } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDoor(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java index 5d4709b72..848065a84 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java @@ -5,6 +5,8 @@ import java.util.Random; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ITooltipProvider; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider { +public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTTransformable { public BlockPlushie() { super(Material.cloth); @@ -37,7 +39,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public Item getItemDropped(int i, Random rand, int j) { return null; } - + @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { TileEntityPlushie entity = (TileEntityPlushie) world.getTileEntity(x, y, z); @@ -47,7 +49,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - + if(!player.capabilities.isCreativeMode) { harvesters.set(player); if(!world.isRemote) { @@ -63,7 +65,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti harvesters.set(null); } } - + @Override public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); @@ -80,7 +82,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int meta = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15; world.setBlockMetadataWithNotify(x, y, z, meta, 2); - + TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.type = PlushieType.values()[Math.abs(stack.getItemDamage()) % PlushieType.values().length]; plushie.markDirty(); @@ -93,7 +95,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.squishTimer = 11; @@ -104,8 +106,13 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti } } - public static class TileEntityPlushie extends TileEntity { - + @Override + public int transformMeta(int meta, int coordBaseMode) { + return (meta + coordBaseMode * 4) % 16; + } + + public static class TileEntityPlushie extends TileEntity implements INBTTileEntityTransformable { + public PlushieType type = PlushieType.NONE; public int squishTimer; @@ -120,7 +127,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -137,8 +144,13 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti super.writeToNBT(nbt); nbt.setByte("type", (byte) type.ordinal()); } + + @Override + public void transformTE(World world, int coordBaseMode) { + type = PlushieType.values()[world.rand.nextInt(PlushieType.values().length - 1) + 1]; + } } - + public static enum PlushieType { NONE( "NONE", null), YOMI( "Yomi", "Hi! Can I be your rabbit friend?"), @@ -147,7 +159,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti public String label; public String inscription; - + private PlushieType(String label, String inscription) { this.label = label; this.inscription = inscription; diff --git a/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java b/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java new file mode 100644 index 000000000..e64243534 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java @@ -0,0 +1,114 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockSkeletonHolder extends BlockContainer { + + public BlockSkeletonHolder() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntitySkeletonHolder(); + } + + @Override public int getRenderType() { return -1; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) return true; + if(player.isSneaking()) return false; + + TileEntitySkeletonHolder pedestal = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z); + + if(pedestal.item == null && player.getHeldItem() != null) { + pedestal.item = player.getHeldItem().copy(); + player.inventory.mainInventory[player.inventory.currentItem] = null; + pedestal.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } else if(pedestal.item != null && player.getHeldItem() == null) { + player.inventory.mainInventory[player.inventory.currentItem] = pedestal.item.copy(); + pedestal.item = null; + pedestal.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + if(!world.isRemote) { + TileEntitySkeletonHolder entity = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z); + if(entity != null && entity.item != null) { + EntityItem item = new EntityItem(world, x + 0.5, y, z + 0.5, entity.item.copy()); + world.spawnEntityInWorld(item); + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public static class TileEntitySkeletonHolder extends TileEntity { + + public ItemStack item; + + @Override public boolean canUpdate() { return false; } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.item = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("item")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(this.item != null) { + NBTTagCompound stack = new NBTTagCompound(); + this.item.writeToNBT(stack); + nbt.setTag("item", stack); + } + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java index a8a44a55e..365c42e56 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java @@ -9,6 +9,7 @@ import com.hbm.blocks.IBlockSideRotation; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; @@ -144,6 +145,8 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio return true; } + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) return false; + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java index 80b1f3b92..2440a5d7d 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -12,6 +12,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.StructureConfig; import com.hbm.itempool.ItemPool; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.I18nUtil; @@ -248,6 +249,11 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool } private void replace() { + if(!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLoot)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a loot block but we're doing a TE update as if it is, cancelling!"); + return; + } + WeightedRandomChestContent[] pool = ItemPool.getPool(poolName); worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2); diff --git a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java index 817914f5c..b5d111c13 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java +++ b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java @@ -1,6 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.main.MainRegistry; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -16,8 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public abstract class BlockMachineBase extends BlockContainer { - +public abstract class BlockMachineBase extends BlockContainer implements INBTTransformable { + int guiID = -1; protected boolean rotatable = false; @@ -25,13 +26,13 @@ public abstract class BlockMachineBase extends BlockContainer { super(mat); this.guiID = guiID; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(guiID == -1) return false; - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -41,9 +42,9 @@ public abstract class BlockMachineBase extends BlockContainer { return false; } } - + private static boolean keepInventory; - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { @@ -96,18 +97,24 @@ public abstract class BlockMachineBase extends BlockContainer { super.breakBlock(world, x, y, z, block, meta); } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - + if(!rotatable) return; - + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + if(!rotatable) return meta; + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 3e3ea35ab..465ea6c69 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineEPress; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -19,7 +20,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineEPress extends BlockContainer { +public class MachineEPress extends BlockContainer implements INBTTransformable { private final Random field_149933_a = new Random(); private static boolean keepInventory; @@ -120,4 +121,9 @@ public class MachineEPress extends BlockContainer { return false; } } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index f5a89d404..8c1c57663 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -15,6 +15,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -26,6 +27,8 @@ import net.minecraftforge.common.util.ForgeDirection; public class Spotlight extends Block implements ISpotlight, INBTTransformable { + public static boolean disableOnGeneration = true; + // I'd be extending the ReinforcedLamp class if it wasn't for the inverted behaviour of these specific lights // I want these blocks to be eminently useful, so removing the need for redstone by default is desired, // these act more like redstone torches, in that applying a signal turns them off @@ -220,6 +223,31 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { return ForgeDirection.getOrientation(metadata >> 1); } + // Replace bulbs on broken lights with a click + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + int meta = world.getBlockMetadata(x, y, z); + if(!isBroken(meta)) return false; + + repair(world, x, y, z); + return true; + } + + private void repair(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if(!isBroken(meta)) return; + + world.setBlock(x, y, z, getOn(), meta - 1, 2); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + int ox = x + dir.offsetX; + int oy = y + dir.offsetY; + int oz = z + dir.offsetZ; + Block block = world.getBlock(ox, oy, oz); + if(block == this) repair(world, ox, oy, oz); + } + } + public boolean isBroken(int metadata) { return (metadata & 1) == 1; } @@ -326,11 +354,13 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { // +1 to set as broken, won't turn on until broken and replaced - return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + 1; + int disabled = disableOnGeneration ? 1 : 0; + return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; } @Override public Block transformBlock(Block block) { + if(!disableOnGeneration) return block; if(block == ModBlocks.spotlight_incandescent) return ModBlocks.spotlight_incandescent_off; if(block == ModBlocks.spotlight_fluoro) return ModBlocks.spotlight_fluoro_off; if(block == ModBlocks.spotlight_halogen) return ModBlocks.spotlight_halogen_off; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 6dba321ce..df7899d3a 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -206,4 +206,9 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo public static int renderIDRods = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDPassive = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDControl = RenderingRegistry.getNextAvailableRenderId(); -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return meta; + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 84c9df2a6..4399f08c3 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -108,11 +108,6 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.lead_gavel, 1), new Object[] { "PIP", "IGI", "PIP", 'P', ModItems.pellet_buckshot, 'I', PB.ingot(), 'G', ModItems.wood_gavel }); //Misc weapons - CraftingManager.addRecipeAuto(new ItemStack(ModItems.saw, 1), new Object[] { "IIL", "PP ", 'P', STEEL.plate(), 'I', STEEL.ingot(), 'L', Items.leather }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bat, 1), new Object[] { "P", "P", "S", 'S', STEEL.plate(), 'P', KEY_PLANKS }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bat_nail, 1), new Object[] { ModItems.bat, STEEL.plate() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.golf_club, 1), new Object[] { "IP", " P", " P", 'P', STEEL.plate(), 'I', STEEL.ingot() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipe_rusty, 1), new Object[] { "II", " I", " I", 'I', IRON.pipe() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipe_lead, 1), new Object[] { "II", " I", " I", 'I', PB.pipe() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ullapool_caber, 1), new Object[] { "ITI", " S ", " S ", 'I', IRON.plate(), 'T', Blocks.tnt, 'S', KEY_STICK }); @@ -197,14 +192,6 @@ public class ToolRecipes { addShovel( SA326.ingot(), ModItems.schrabidium_shovel); addHoe( SA326.ingot(), ModItems.schrabidium_hoe); } else { - /* - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_sword, 1), new Object[] { " I ", " I ", "SBS", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_sword }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_pickaxe, 1), new Object[] { "III", " B ", " S ", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_pickaxe }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_axe, 1), new Object[] { "II", "IB", " S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_axe }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_shovel, 1), new Object[] { "I", "B", "S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_shovel }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_hoe, 1), new Object[] { "II", " B", " S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_hoe }); - - */ CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_sword, 1), new Object[] { " I ", " B ", "ISI", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_sword }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_pickaxe, 1), new Object[] { "ISI", " B ", " I ", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_pickaxe }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_axe, 1), new Object[] { "IS", "IB", " I", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_axe }); diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 5ba032b13..959d5eabc 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -16,6 +16,8 @@ import com.hbm.items.ModItems; import com.hbm.items.weapon.GunB92Cell; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModGeneric; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModSpecial; import com.hbm.main.CraftingManager; import net.minecraft.init.Blocks; @@ -84,7 +86,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_minigun, 1), new Object[] { "BMG", "BRE", "BGM", 'B', ANY_RESISTANTALLOY.lightBarrel(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip(), 'R', ANY_RESISTANTALLOY.heavyReceiver(), 'E', ModItems.motor_desh }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_missile_launcher, 1), new Object[] { " CM", "BBB", "G ", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'M', WEAPONSTEEL.mechanism(), 'B', ANY_RESISTANTALLOY.heavyBarrel(), 'G', ANY_PLASTIC.grip() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_tesla_cannon, 1), new Object[] { "CCC", "BRB", "MGE", 'C', ModItems.coil_advanced_alloy, 'B', ANY_RESISTANTALLOY.heavyBarrel(), 'R', ANY_RESISTANTALLOY.heavyReceiver(), 'M', WEAPONSTEEL.mechanism(), 'G', ANY_PLASTIC.grip(), 'E', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_stg77, 1), new Object[] { " D ", "BRS", "GM ", 'D', DIAMOND.gem(), 'B', BIGMT.lightBarrel(), 'R', BIGMT.lightReceiver(), 'S', ANY_HARDPLASTIC.stock(), 'G', ANY_HARDPLASTIC.grip(), 'M', BIGMT.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_stg77, 1), new Object[] { " D ", "BRS", "GGM", 'D', DictFrame.fromOne(ModItems.weapon_mod_special, EnumModSpecial.SCOPE), 'B', BIGMT.lightBarrel(), 'R', BIGMT.lightReceiver(), 'S', ANY_HARDPLASTIC.stock(), 'G', ANY_HARDPLASTIC.grip(), 'M', BIGMT.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_fatman, 1), new Object[] { "PPP", "BSR", "G M", 'P', BIGMT.plate(), 'B', BIGMT.heavyBarrel(), 'S', BIGMT.shell(), 'R', BIGMT.heavyReceiver(), 'G', ANY_HARDPLASTIC.grip(), 'M', BIGMT.mechanism() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_tau, 1), new Object[] { " RD", "CTT", "GMS", 'D', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'C', CU.pipe(), 'T', ModItems.coil_advanced_torus, 'G', ANY_HARDPLASTIC.grip(), 'R', BIGMT.lightReceiver(), 'M', BIGMT.mechanism(), 'S', ANY_HARDPLASTIC.stock() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_lasrifle, 1), new Object[] { "LC ", "BRS", "MG ", 'L', ModItems.crystal_redstone, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'B', ANY_BISMOIDBRONZE.lightBarrel(), 'R', ANY_BISMOIDBRONZE.lightReceiver(), 'S', ANY_HARDPLASTIC.stock(), 'M', BIGMT.mechanism(), 'G', ANY_HARDPLASTIC.grip() }); @@ -96,6 +98,39 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_SHOT, 6), new Object[] { "C", "P", "G", 'C', Blocks.gravel, 'P', Items.paper, 'G', Items.gunpowder }); CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_IRON, 6), new Object[] { "C", "P", "G", 'C', IRON.ingot(), 'P', Items.paper, 'G', Items.gunpowder }); + //SEDNA Mods + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DAMAGE.ordinal()), new Object[] { GUNMETAL.ingot(), IRON.ingot(), IRON.ingot(), IRON.ingot(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DURA.ordinal()), new Object[] { GUNMETAL.ingot(), IRON.ingot(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.STEEL_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), STEEL.plateCast(), STEEL.plateCast(), STEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.STEEL_DURA.ordinal()), new Object[] { GUNMETAL.plate(), STEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DURA_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), DURA.plateCast(), DURA.plateCast(), DURA.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DURA_DURA.ordinal()), new Object[] { GUNMETAL.plate(), DURA.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DESH_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), DESH.plateCast(), DESH.plateCast(), DESH.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DESH_DURA.ordinal()), new Object[] { GUNMETAL.plate(), DESH.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.WSTEEL_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), WEAPONSTEEL.plateCast(), WEAPONSTEEL.plateCast(), WEAPONSTEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.WSTEEL_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), WEAPONSTEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.FERRO_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), FERRO.plateCast(), FERRO.plateCast(), FERRO.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.FERRO_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), FERRO.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.TCALLOY_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), ANY_RESISTANTALLOY.plateCast(), ANY_RESISTANTALLOY.plateCast(), ANY_RESISTANTALLOY.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.TCALLOY_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), ANY_RESISTANTALLOY.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BIGMT_DAMAGE.ordinal()), new Object[] { BIGMT.mechanism(), BIGMT.plateCast(), BIGMT.plateCast(), BIGMT.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BIGMT_DURA.ordinal()), new Object[] { BIGMT.plate(), BIGMT.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BRONZE_DAMAGE.ordinal()), new Object[] { BIGMT.mechanism(), ANY_BISMOIDBRONZE.plateCast(), ANY_BISMOIDBRONZE.plateCast(), ANY_BISMOIDBRONZE.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BRONZE_DURA.ordinal()), new Object[] { BIGMT.plate(), ANY_BISMOIDBRONZE.plateCast(), ModItems.ducttape }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SILENCER.ordinal()), new Object[] { "P", "B", "P", 'P', ANY_PLASTIC.ingot(), 'B', STEEL.lightBarrel() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SCOPE.ordinal()), new Object[] { "SPS", "G G", "SPS", 'P', ANY_PLASTIC.ingot(), 'S', STEEL.plate(), 'G', KEY_ANYPANE }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SAW.ordinal()), new Object[] { "BBS", "BHB", 'B', STEEL.bolt(), 'S', KEY_STICK, 'H', DURA.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SPEEDLOADER.ordinal()), new Object[] { " B ", "BSB", " B ", 'B', STEEL.bolt(), 'S', WEAPONSTEEL.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SLOWDOWN.ordinal()), new Object[] { " I ", " M ", "I I", 'I', WEAPONSTEEL.ingot(), 'M', WEAPONSTEEL.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SPEEDUP.ordinal()), new Object[] { "PIP", "WWW", "PIP", 'P', WEAPONSTEEL.plate(), 'I', GUNMETAL.ingot(), 'W', GOLD.wireDense() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.GREASEGUN.ordinal()), new Object[] { "BRM", "P G", 'B', WEAPONSTEEL.lightBarrel(), 'R', WEAPONSTEEL.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'P', DURA.plate(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.CHOKE.ordinal()), new Object[] { "P", "B", "P", 'P', WEAPONSTEEL.plate(), 'B', DURA.lightBarrel() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.FURNITURE_GREEN.ordinal()), new Object[] { "PDS", " G", 'P', ANY_PLASTIC.ingot(), 'D', KEY_GREEN, 'S', ANY_PLASTIC.stock(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.FURNITURE_BLACK.ordinal()), new Object[] { "PDS", " G", 'P', ANY_PLASTIC.ingot(), 'D', KEY_BLACK, 'S', ANY_PLASTIC.stock(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SKIN_SATURNITE.ordinal()), new Object[] { "BRM", " P ", 'B', BIGMT.lightBarrel(), 'R', BIGMT.lightReceiver(), 'M', BIGMT.mechanism(), 'P', BIGMT.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.STACK_MAG.ordinal()), new Object[] { "P P", "P P", "PMP", 'P', WEAPONSTEEL.plate(), 'M', BIGMT.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.BAYONET.ordinal()), new Object[] { " P", "BBB", 'P', WEAPONSTEEL.plate(), 'B', STEEL.bolt() }); + //Nitra! CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_SP, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_SP), ModItems.nitra }); CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_SP, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_SP), ModItems.nitra }); @@ -152,7 +187,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.mp_chip_5, 1), new Object[] { "P", "C", "S", 'P', ANY_RUBBER.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'S', ModBlocks.steel_scaffold }); //Turrets - CraftingManager.addRecipeAuto(new ItemStack(ModBlocks.turret_sentry, 1), new Object[] { "PPL", " MD", " SC", 'P', STEEL.plate(), 'M', ModItems.motor, 'L', ModItems.mechanism_rifle_1, 'S', ModBlocks.steel_scaffold, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'D', ModItems.crt_display }); + CraftingManager.addRecipeAuto(new ItemStack(ModBlocks.turret_sentry, 1), new Object[] { "PPL", " MD", " SC", 'P', STEEL.plate(), 'M', ModItems.motor, 'L', GUNMETAL.mechanism(), 'S', ModBlocks.steel_scaffold, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'D', ModItems.crt_display }); //Guns CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_b92), new Object[] { "DDD", "SSC", " R", 'D', ModItems.plate_dineutronium, 'S', STAR.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'R', ModItems.gun_lasrifle }); diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 9d0437c72..b9e6bb10d 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -17,7 +17,6 @@ import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.entity.mob.*; import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.glyphid.*; -import com.hbm.entity.mob.siege.*; import com.hbm.entity.particle.*; import com.hbm.entity.projectile.*; import com.hbm.entity.train.EntityRailCarBase.BoundingBoxDummyEntity; @@ -198,7 +197,6 @@ public class EntityMappings { addEntity(EntityNukeTorex.class, "entity_effect_torex", 250, false); addEntity(EntityArtilleryShell.class, "entity_artillery_shell", 1000); addEntity(EntityArtilleryRocket.class, "entity_himars", 1000); - addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); addEntity(EntitySawblade.class, "entity_stray_saw", 1000); addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); @@ -237,10 +235,6 @@ public class EntityMappings { addMob(EntityFBI.class, "entity_ntm_fbi", 0x008000, 0x404040); addMob(EntityFBIDrone.class, "entity_ntm_fbi_drone", 0x008000, 0x404040); addMob(EntityRADBeast.class, "entity_ntm_radiation_blaze", 0x303030, 0x008000); - addMob(EntitySiegeZombie.class, "entity_meme_zombie", 0x303030, 0x008000); - addMob(EntitySiegeSkeleton.class, "entity_meme_skeleton", 0x303030, 0x000080); - addMob(EntitySiegeUFO.class, "entity_meme_ufo", 0x303030, 0x800000); - addMob(EntitySiegeCraft.class, "entity_meme_craft", 0x303030, 0x808000); addMob(EntityGlyphid.class, "entity_glyphid", 0x724A21, 0xD2BB72); addMob(EntityGlyphidBrawler.class, "entity_glyphid_brawler", 0x273038, 0xD2BB72); addMob(EntityGlyphidBehemoth.class, "entity_glyphid_behemoth", 0x267F00, 0xD2BB72); @@ -253,6 +247,7 @@ public class EntityMappings { addMob(EntityPlasticBag.class, "entity_plastic_bag", 0xd0d0d0, 0x808080); addMob(EntityParasiteMaggot.class, "entity_parasite_maggot", 0xd0d0d0, 0x808080); addMob(EntityDummy.class, "entity_ntm_test_dummy", 0xffffff, 0x000000); + addMob(EntityUndeadSoldier.class, "entity_ntm_undead_soldier", 0x749F30, 0x6C5B44); addSpawn(EntityCreeperPhosgene.class, 5, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); addSpawn(EntityCreeperVolatile.class, 10, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java new file mode 100644 index 000000000..c540dd03b --- /dev/null +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -0,0 +1,111 @@ +package com.hbm.entity.mob; + +import com.hbm.items.ModItems; + +import net.minecraft.block.Block; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.IEntityLivingData; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class EntityUndeadSoldier extends EntityMob { + + public static final int DW_TYPE = 12; + public static final byte TYPE_ZOMBIE = 0; + public static final byte TYPE_SKELETON = 1; + + public EntityUndeadSoldier(World world) { + super(world); + this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(4, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(6, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityVillager.class, 0, true)); + } + + protected void entityInit() { + super.entityInit(); + this.getDataWatcher().addObject(DW_TYPE, Byte.valueOf((byte) 0)); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); + this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); + } + + @Override + protected boolean isAIEnabled() { + return true; + } + + @Override + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { + this.addRandomArmor(); + this.dataWatcher.updateObject(DW_TYPE, rand.nextBoolean() ? TYPE_ZOMBIE : TYPE_SKELETON); + return super.onSpawnWithEgg(data); + } + + @Override + protected void addRandomArmor() { + this.setCurrentItemOrArmor(4, new ItemStack(ModItems.taurun_helmet)); + this.setCurrentItemOrArmor(3, new ItemStack(ModItems.taurun_plate)); + this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); + this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); + + this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); + } + + @Override + protected String getLivingSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.say"; + if(type == TYPE_SKELETON) return "mob.skeleton.say"; + return super.getLivingSound(); + } + + @Override + protected String getHurtSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.hurt"; + if(type == TYPE_SKELETON) return "mob.skeleton.hurt"; + return super.getHurtSound(); + } + + @Override + protected String getDeathSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.death"; + if(type == TYPE_SKELETON) return "mob.skeleton.death"; + return super.getDeathSound(); + } + + @Override + protected void func_145780_a(int x, int y, int z, Block blck) { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) this.playSound("mob.zombie.step", 0.15F, 1.0F); + if(type == TYPE_SKELETON) this.playSound("mob.skeleton.step", 0.15F, 1.0F); + } + + @Override + public EnumCreatureAttribute getCreatureAttribute() { + return EnumCreatureAttribute.UNDEAD; + } + + @Override protected void dropFewItems(boolean player, int loot) { } + @Override protected void dropEquipment(boolean player, int loot) { } +} diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java deleted file mode 100644 index 46e685a52..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.hbm.entity.mob.siege; - -import com.hbm.entity.projectile.EntitySiegeLaser; -import com.hbm.items.ModItems; - -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntitySiegeSkeleton extends EntityMob implements IRangedAttackMob, IRadiationImmune { - - public EntitySiegeSkeleton(World world) { - super(world); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIArrowAttack(this, 1.0D, 20, 60, 15.0F)); - this.tasks.addTask(3, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(5, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - if(tier.noFall && source == DamageSource.fall) - return false; - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).applyModifier(new AttributeModifier("Tier Speed Mod", tier.speedMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).applyModifier(new AttributeModifier("Tier Damage Mod", tier.damageMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - protected void addRandomArmor() { - super.addRandomArmor(); - this.setCurrentItemOrArmor(0, new ItemStack(ModItems.detonator_laser)); - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - this.addRandomArmor(); - return super.onSpawnWithEgg(data); - } - - @Override - public void attackEntityWithRangedAttack(EntityLivingBase target, float f) { - - double x = posX; - double y = posY + this.getEyeHeight(); - double z = posZ; - - Vec3 vec = Vec3.createVectorHelper(target.posX - x, target.posY + target.getYOffset() + target.height * 0.5 - y, target.posZ - z).normalize(); - - SiegeTier tier = this.getTier(); - - for(int i = 0; i < 3; i++) { - EntitySiegeLaser laser = new EntitySiegeLaser(worldObj, this); - laser.setPosition(x, y, z); - laser.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 1F, i == 1 ? 0.15F : 5F); - laser.setColor(0x808000); - laser.setDamage(tier.damageMod); - laser.setExplosive(tier.laserExplosive); - laser.setBreakChance(tier.laserBreak); - if(tier.laserIncendiary) laser.setIncendiary(); - worldObj.spawnEntityInWorld(laser); - } - - this.playSound("hbm:weapon.ballsLaser", 2.0F, 0.9F + rand.nextFloat() * 0.2F); - } - - @Override - protected boolean isAIEnabled() { - return true; - } - - @Override - protected String getLivingSound() { - return "hbm:entity.siegeIdle"; - } - - @Override - protected String getHurtSound() { - return "hbm:entity.siegeHurt"; - } - - @Override - protected String getDeathSound() { - return "hbm:entity.siegeDeath"; - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java deleted file mode 100644 index 12551252a..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.hbm.entity.mob.siege; - -import com.hbm.entity.mob.EntityUFOBase; -import com.hbm.entity.projectile.EntitySiegeLaser; -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntitySiegeUFO extends EntityUFOBase implements IRadiationImmune { - - private int attackCooldown; - - public EntitySiegeUFO(World world) { - super(world); - this.setSize(1.5F, 1F); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(tier.speedMod); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health * 0.25); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void updateEntityActionState() { - super.updateEntityActionState(); - - if(this.courseChangeCooldown > 0) { - this.courseChangeCooldown--; - } - if(this.scanCooldown > 0) { - this.scanCooldown--; - } - - if(!worldObj.isRemote) { - if(this.attackCooldown > 0) { - this.attackCooldown--; - } - - if(this.attackCooldown == 0 && this.target != null) { - this.attackCooldown = 20 + rand.nextInt(5); - - double x = posX; - double y = posY; - double z = posZ; - - Vec3 vec = Vec3.createVectorHelper(target.posX - x, target.posY + target.height * 0.5 - y, target.posZ - z).normalize(); - SiegeTier tier = this.getTier(); - - EntitySiegeLaser laser = new EntitySiegeLaser(worldObj, this); - laser.setPosition(x, y, z); - laser.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 1F, 0.15F); - laser.setColor(0x802000); - laser.setDamage(tier.damageMod); - laser.setExplosive(tier.laserExplosive); - laser.setBreakChance(tier.laserBreak); - if(tier.laserIncendiary) laser.setIncendiary(); - worldObj.spawnEntityInWorld(laser); - this.playSound("hbm:weapon.ballsLaser", 2.0F, 1.0F); - } - } - - if(this.courseChangeCooldown > 0) { - approachPosition(this.target == null ? 0.25D : 0.5D + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() * 1); - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - return super.onSpawnWithEgg(data); - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java deleted file mode 100644 index 82ac62ce8..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.hbm.entity.mob.siege; - -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.world.World; - -public class EntitySiegeZombie extends EntityMob implements IRadiationImmune { - - public EntitySiegeZombie(World world) { - super(world); - this.getNavigator().setBreakDoors(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(3, new EntityAIMoveTowardsRestriction(this, 1.0D)); - this.tasks.addTask(4, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(5, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.6F, 1.8F); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - if(tier.noFall && source == DamageSource.fall) - return false; - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - this.getDataWatcher().addObject(13, (byte) 0); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).applyModifier(new AttributeModifier("Tier Speed Mod", tier.speedMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).applyModifier(new AttributeModifier("Tier Damage Mod", tier.damageMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - protected boolean isAIEnabled() { - return true; - } - - @Override - protected String getLivingSound() { - return "hbm:entity.siegeIdle"; - } - - @Override - protected String getHurtSound() { - return "hbm:entity.siegeHurt"; - } - - @Override - protected String getDeathSound() { - return "hbm:entity.siegeDeath"; - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } - - @Override - public void onUpdate() { - - super.onUpdate(); - if(!worldObj.isRemote) { - this.dataWatcher.updateObject(13, (byte)(this.getAttackTarget() != null ? 1 : 0)); - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - return super.onSpawnWithEgg(data); - } -} \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java b/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java index cdbce5b5c..92b08e2c7 100644 --- a/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java +++ b/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java @@ -2,6 +2,9 @@ package com.hbm.handler.nei; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.recipes.FuelPoolRecipes; +import com.hbm.items.machine.ItemRBMKRod; + +import net.minecraft.item.ItemStack; public class FuelPoolHandler extends NEIUniversalHandler { @@ -13,4 +16,22 @@ public class FuelPoolHandler extends NEIUniversalHandler { public String getKey() { return "ntmSpentDrum"; } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) < 50 && ItemRBMKRod.getHullHeat(ingredient) < 50) return; + } + + super.loadUsageRecipes(ingredient); + } + + @Override + public void loadCraftingRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) >= 50 || ItemRBMKRod.getHullHeat(ingredient) >= 50) return; + } + + super.loadCraftingRecipes(ingredient); + } } diff --git a/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java new file mode 100644 index 000000000..1e7decef2 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java @@ -0,0 +1,94 @@ +package com.hbm.handler.nei; + +import java.util.HashMap; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.machine.ItemRBMKRod; + +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class RBMKRodDisassemblyHandler extends NEIUniversalHandler { + + public RBMKRodDisassemblyHandler() { + super("RBMK Rod Disassembly", Blocks.crafting_table, getRecipes()); + } + + @Override + public String getKey() { + return "ntmRBMKDisassembly"; + } + + public static HashMap getRecipes() { + HashMap map = new HashMap<>(); + + for(ItemRBMKRod rod : ItemRBMKRod.craftableRods) { + for(int enrichment = 0; enrichment <= 4; enrichment++) { + ItemStack result = new ItemStack(rod.pellet, 8, enrichment); + map.put(new ComparableStackHeat(rod, false, enrichment, false), result); + + if(rod.pellet.isXenonEnabled()) { + ItemStack resultPoison = new ItemStack(rod.pellet, 8, enrichment + 5); + map.put(new ComparableStackHeat(rod, false, enrichment, true), resultPoison); + } + } + } + + return map; + } + + // Don't show recipes for hot rods (which will cause it to only show cooling recipes) + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) > 50 || ItemRBMKRod.getHullHeat(ingredient) > 50) return; + } + + super.loadUsageRecipes(ingredient); + } + + public static class ComparableStackHeat extends ComparableStack { + + // I was going to filter by all of these, but found it is just best to show all possible recipes for everything but heat + private final boolean isHot; + private final int enrichment; + private final boolean hasPoison; + + public ComparableStackHeat(Item item, boolean isHot) { + this(item, isHot, -1, false); + } + + public ComparableStackHeat(Item item, boolean isHot, int enrichment, boolean hasPoison) { + super(item); + this.isHot = isHot; + this.enrichment = enrichment; + this.hasPoison = hasPoison; + } + + public ItemStack toStack() { + ItemStack stack = super.toStack(); + ItemRBMKRod rod = (ItemRBMKRod) stack.getItem(); + if(enrichment >= 0) { + ItemRBMKRod.setYield(stack, Math.min(1 - ((double) enrichment) / 5, 0.99) * rod.yield); + } else { + ItemRBMKRod.setYield(stack, 0.2 * rod.yield); + } + if(hasPoison) ItemRBMKRod.setPoison(stack, 50); + if(!isHot) return stack; + ItemRBMKRod.setCoreHeat(stack, 100); + ItemRBMKRod.setHullHeat(stack, 50); + return stack; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + enrichment; + result = prime * result + (hasPoison ? 1 : 0); + return result; + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java b/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java new file mode 100644 index 000000000..9be5a6ae2 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java @@ -0,0 +1,40 @@ +package com.hbm.handler.nei; + +import java.util.HashMap; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.items.special.ItemWasteLong; +import com.hbm.items.special.ItemWasteShort; + +import net.minecraft.item.ItemStack; + +public class RBMKWasteDecayHandler extends NEIUniversalHandler { + + public RBMKWasteDecayHandler() { + super("Nuclear Waste Decay", ModBlocks.machine_storage_drum, getRecipes()); + } + + @Override + public String getKey() { + return "ntmRBMKWaste"; + } + + public static HashMap getRecipes() { + HashMap map = new HashMap<>(); + + for(ItemWasteShort.WasteClass waste : ItemWasteShort.WasteClass.values()) { + map.put(new ComparableStack(ModItems.nuclear_waste_short, 1, waste), new ItemStack(ModItems.nuclear_waste_short_depleted, 1, waste.ordinal())); + map.put(new ComparableStack(ModItems.nuclear_waste_short_tiny, 1, waste), new ItemStack(ModItems.nuclear_waste_short_depleted_tiny, 1, waste.ordinal())); + } + + for(ItemWasteLong.WasteClass waste : ItemWasteLong.WasteClass.values()) { + map.put(new ComparableStack(ModItems.nuclear_waste_long, 1, waste), new ItemStack(ModItems.nuclear_waste_long_depleted, 1, waste.ordinal())); + map.put(new ComparableStack(ModItems.nuclear_waste_long_tiny, 1, waste), new ItemStack(ModItems.nuclear_waste_long_depleted_tiny, 1, waste.ordinal())); + } + + return map; + } + +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index b19725c1f..84df7fad8 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.items.block.ItemBlockStorageCrate; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; @@ -18,8 +19,15 @@ public class ContainerCrateBase extends ContainerBase { @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { // prevents the player from moving around the currently open box - if(mode == 2 && button == player.inventory.currentItem) return null; - if(index == player.inventory.currentItem + 27 + this.tile.getSizeInventory()) return null; + if(player.inventory.getStackInSlot(player.inventory.currentItem) != null && + player.inventory.getStackInSlot(player.inventory.currentItem).getItem() instanceof ItemBlockStorageCrate) { + if (mode == 2 && button == player.inventory.currentItem) { + return null; + } + if (index == player.inventory.currentItem + 27 + this.tile.getSizeInventory()) { + return null; + } + } return super.slotClick(index, button, mode, player); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java index d4528cac9..7832b11dc 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java @@ -2,6 +2,7 @@ package com.hbm.inventory.container; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.mods.WeaponModManager; +import com.hbm.util.InventoryUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -26,7 +27,7 @@ public class ContainerWeaponTable extends Container { @Override public boolean isItemValid(ItemStack stack) { - return stack.getItem() instanceof ItemGunBaseNT; + return gun.getStackInSlot(0) == null && stack.getItem() instanceof ItemGunBaseNT; } @Override @@ -152,8 +153,33 @@ public class ContainerWeaponTable extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - return null; + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack copy = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + copy = stack.copy(); + + if(index < 8) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 8, this.inventorySlots.size(), true)) return null; + slot.onPickupFromSlot(player, stack); + } else { + if(stack.getItem() instanceof ItemGunBaseNT) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 7, 8, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 7, false)) return null; + } + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return copy; } public class ModSlot extends Slot { @@ -171,12 +197,14 @@ public class ContainerWeaponTable extends Container { public void putStack(ItemStack stack) { super.putStack(stack); refreshInstalledMods(); + WeaponModManager.onInstallStack(gun.getStackInSlot(0), stack, index); } @Override public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onPickupFromSlot(player, stack); refreshInstalledMods(); + WeaponModManager.onUninstallStack(gun.getStackInSlot(0), stack, index); } public void refreshInstalledMods() { diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java index 7867f1bc2..542ddb96b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java @@ -366,6 +366,10 @@ public class GUIRBMKConsole extends GuiScreen { int fe = (int)Math.ceil((col.data.getDouble("enrichment")) * 8); if(fe > 8) fe = 8; drawTexturedModalRect(guiLeft + x + 4, guiTop + y + size - fe - 1, 14, 191 - fe, 2, fe); + + int fx = (int)Math.ceil((col.data.getDouble("xenon")) * 8 / 100); + if(fx > 8) fx = 8; + drawTexturedModalRect(guiLeft + x + 7, guiTop + y + size - fx - 1, 17, 191 - fx, 2, fx); } break; diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index d95b7c51f..4a61981ff 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -138,10 +138,10 @@ public class Mats { public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, BLOCK).m(); public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x183039, 0x030B0B, 0x376373).setAutogen(BOLT, DUST, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x183039, 0x030B0B, 0x376373).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xCCCCEA, 0x11111A, 0xA5A5D3).setAutogen(DUST, DENSEWIRE, BLOCK).m(); - public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(HEAVYBARREL, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(CASTPLATE, HEAVYBARREL, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BBRONZE = makeSmeltable(_AS + 16, BBRONZE, 0xE19A69, 0x485353, 0x987D65).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER).m(); @@ -154,7 +154,7 @@ public class Mats { public static final NTMMaterial MAT_SLAG = makeSmeltable(_AS + 11, SLAG, 0x554940, 0x34281F, 0x6C6562).setAutogen(BLOCK).n(); public static final NTMMaterial MAT_MUD = makeSmeltable(_AS + 14, MUD, 0xBCB5A9, 0x481213, 0x96783B).n(); public static final NTMMaterial MAT_GUNMETAL = makeSmeltable(_AS + 19, GUNMETAL, 0xFFEF3F, 0xAD3600, 0xF9C62C).setAutogen(LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); - public static final NTMMaterial MAT_WEAPONSTEEL = makeSmeltable(_AS + 20, WEAPONSTEEL, 0xA0A0A0, 0x000000, 0x808080).setAutogen(SHELL, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); + public static final NTMMaterial MAT_WEAPONSTEEL = makeSmeltable(_AS + 20, WEAPONSTEEL, 0xA0A0A0, 0x000000, 0x808080).setAutogen(CASTPLATE, SHELL, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0x3AC4DA, 0x09282C, 0x30A4B7).setAutogen(PLATE, CASTPLATE, SHELL, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).m(); //Extension diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index e1fddc0de..de3fd9e09 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -39,6 +39,7 @@ public class AmmoPressRecipes extends SerializableRecipe { OreDictStack copper = new OreDictStack(CU.ingot()); OreDictStack plastic = new OreDictStack(ANY_PLASTIC.ingot()); OreDictStack uranium = new OreDictStack(U238.ingot()); + OreDictStack ferro = new OreDictStack(FERRO.ingot()); ComparableStack smokeful = new ComparableStack(Items.gunpowder); OreDictStack smokeless = new OreDictStack(ANY_SMOKELESS.dust()); ComparableStack rocket = new ComparableStack(ModItems.rocket_fuel); @@ -137,6 +138,27 @@ public class AmmoPressRecipes extends SerializableRecipe { null, smokeless.copy(2), null, null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_SP, 8), + null, lead, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_FMJ, 8), + null, steel, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_JHP, 8), + plastic, copper, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_AP, 8), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_DU, 8), + null, uranium, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_SP, 16), null, lead.copy(2), null, null, smokeless.copy(2), null, @@ -174,6 +196,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, uranium.copy(2), null, null, smokeless.copy(4), null, null, sSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_HE, 12), + he, ferro, null, + null, smokeless.copy(4), null, + null, sSmall.copy(2), null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_SP, 12), null, lead.copy(2), null, @@ -195,6 +221,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, uranium.copy(2), null, null, smokeless.copy(6), null, null, sBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_HE, 12), + he, ferro, null, + null, smokeless.copy(6), null, + null, sBig, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G12_BP, 6), null, nugget.copy(6), null, @@ -238,21 +268,22 @@ public class AmmoPressRecipes extends SerializableRecipe { null, nugget.copy(8), null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_SHRAPNEL, 4), plastic, nugget.copy(8), null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_DU, 4), null, uranium, null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_SLUG, 4), null, lead, null, null, smokeless.copy(2), null, null, sShell, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_EXPLOSIVE, 4), + he, ferro, null, + null, smokeless.copy(2), null, + null, sShell, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G26_FLARE, 4), null, rp, null, @@ -366,7 +397,6 @@ public class AmmoPressRecipes extends SerializableRecipe { null, lPlate , null)); OreDictStack tungsten = new OreDictStack(W.ingot()); - OreDictStack ferro = new OreDictStack(FERRO.ingot()); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.COIL_TUNGSTEN, 4), null, null, null, null, tungsten, null, diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index c1949152a..c9aaeb836 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -74,7 +74,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.asbestos_cloth, 4), new AStack[] {new OreDictStack(ASBESTOS.ingot(), 2), new ComparableStack(Items.string, 6), new ComparableStack(Blocks.wool, 1), },50); makeRecipe(new ComparableStack(ModItems.filter_coal, 1), new AStack[] {new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1), },50); makeRecipe(new ComparableStack(ModItems.centrifuge_element, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1), }, 100); - makeRecipe(new ComparableStack(ModItems.magnet_circular, 1), new AStack[] {new ComparableStack(ModBlocks.fusion_conductor, 5), new OreDictStack(STEEL.ingot(), 4), new OreDictStack(ALLOY.plate(), 6), },150); makeRecipe(new ComparableStack(ModItems.reactor_core, 1), new AStack[] {new OreDictStack(PB.ingot(), 8), new OreDictStack(BE.ingot(), 6), new OreDictStack(STEEL.plate(), 16), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(FIBER.ingot(), 2) },100); makeRecipe(new ComparableStack(ModItems.rtg_unit, 1), new AStack[] {new ComparableStack(ModItems.thermo_element, 2), new OreDictStack(CU.plateCast(), 1), new OreDictStack(PB.ingot(), 2), new OreDictStack(STEEL.plate(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CAPACITOR.ordinal()), },100); makeRecipe(new ComparableStack(ModItems.levitation_unit, 1), new AStack[] {new ComparableStack(ModItems.coil_copper, 4), new ComparableStack(ModItems.coil_tungsten, 2), new OreDictStack(TI.plate(), 6), new ComparableStack(ModItems.nugget_schrabidium, 2), },100); @@ -626,34 +625,31 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.turret_chekhov, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), - new ComparableStack(ModItems.mechanism_rifle_2, 1), + new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_friendly, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), new OreDictStack(STEEL.pipe(), 3), - new ComparableStack(ModItems.mechanism_rifle_1, 1), + new OreDictStack(GUNMETAL.mechanism(), 1), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_jeremy, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(STEEL.shell(), 3), - new ComparableStack(ModItems.mechanism_launcher_2, 1), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); @@ -665,42 +661,39 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(CU.ingot(), 32), - new ComparableStack(ModItems.mechanism_special, 1), + new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.battery_lithium, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_richard, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.shell(), 8), - new ComparableStack(ModItems.mechanism_launcher_2, 1), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_howard, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 24), - new OreDictStack(DURA.ingot(), 6), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 10), - new ComparableStack(ModItems.mechanism_rifle_2, 2), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_maxwell, 1), new AStack[] { new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 24), - new OreDictStack(DURA.ingot(), 6), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 4), - new ComparableStack(ModItems.mechanism_special, 3), + new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.magnetron, 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new ComparableStack(ModItems.crt_display, 1) @@ -708,33 +701,30 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.turret_fritz, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), - new ComparableStack(ModItems.mechanism_launcher_1, 1), + new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_arty, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), - new OreDictStack(DURA.ingot(), 32), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), - new ComparableStack(ModItems.mechanism_launcher_2, 3), + new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_himars, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), - new OreDictStack(DURA.ingot(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), - new ComparableStack(ModItems.mechanism_launcher_2, 5), + new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 300); diff --git a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java index 9f01c9d80..12bf21f4e 100644 --- a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java @@ -8,15 +8,17 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.handler.nei.RBMKRodDisassemblyHandler; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemRBMKRod; import net.minecraft.item.ItemStack; public class FuelPoolRecipes extends SerializableRecipe { - + public static final HashMap recipes = new HashMap(); public static final FuelPoolRecipes instance = new FuelPoolRecipes(); @@ -38,8 +40,14 @@ public class FuelPoolRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.waste_plate_sa326, 1, 1), new ItemStack(ModItems.waste_plate_sa326)); recipes.put(new ComparableStack(ModItems.waste_plate_ra226be, 1, 1), new ItemStack(ModItems.waste_plate_ra226be)); recipes.put(new ComparableStack(ModItems.waste_plate_pu238be, 1, 1), new ItemStack(ModItems.waste_plate_pu238be)); - + for(EnumPWRFuel pwr : EnumPWRFuel.values()) recipes.put(new ComparableStack(ModItems.pwr_fuel_hot, 1, pwr.ordinal()), new ItemStack(ModItems.pwr_fuel_depleted, 1, pwr.ordinal())); + + for(ItemRBMKRod rod : ItemRBMKRod.craftableRods) { + ItemStack result = new ItemStack(rod); + ItemRBMKRod.setYield(result, 0.2 * rod.yield); + recipes.put(new RBMKRodDisassemblyHandler.ComparableStackHeat(rod, true), result); + } } @Override diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index c5d5c95bb..cba9cb424 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -74,6 +74,15 @@ public class PedestalRecipes extends SerializableRecipe { new ComparableStack(ModItems.item_secret, 4, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.item_secret, 2, EnumSecretType.CONTROLLER), new ComparableStack(ModItems.item_secret, 4, EnumSecretType.SELENIUM_STEEL)) .extra(PedestalExtraCondition.FULL_MOON)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.gun_aberrator), + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new OreDictStack(BIGMT.mechanism(), 4), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.gun_aberrator_eott), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new OreDictStack(BIGMT.mechanism(), 16), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR))); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_SM.ordinal()), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new ComparableStack(ModBlocks.moon_turf), new ComparableStack(ModItems.powder_magic), @@ -84,6 +93,10 @@ public class PedestalRecipes extends SerializableRecipe { new ComparableStack(ModItems.powder_magic), new ComparableStack(ModItems.ammo_standard, 4, EnumAmmo.NUKE_HIGH), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) .extra(PedestalExtraCondition.FULL_MOON)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 5, EnumAmmoSecret.P35_800.ordinal()), + null, null, null, + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, + null, null, null)); } @Override diff --git a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java index 5fbd16c08..51e0ae85d 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java @@ -3,6 +3,7 @@ package com.hbm.itempool; import static com.hbm.lib.HbmChestContents.weighted; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.Mats; import com.hbm.items.ItemEnums.EnumCokeType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; @@ -23,6 +24,7 @@ public class ItemPoolsComponent { public static final String POOL_VAULT_LAB = "POOL_VAULT_LAB"; public static final String POOL_VAULT_LOCKERS = "POOL_VAULT_LOCKERS"; public static final String POOL_METEOR_SAFE = "POOL_METEOR_SAFE"; + public static final String POOL_OIL_RIG = "POOL_OIL_RIG"; public static void init() { @@ -197,5 +199,16 @@ public class ItemPoolsComponent { weighted(ModItems.stamp_book, 7, 1, 1, 1), }; }}; + + new ItemPool(POOL_OIL_RIG) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.oil_detector, 0, 1, 1, 1), + weighted(ModItems.canister_full, Fluids.OIL.getID(), 1, 4, 5), + weighted(ModBlocks.machine_fraction_tower,0, 0, 1, 1), + weighted(ModBlocks.fraction_spacer,0, 0, 1, 1), + weighted(ModItems.circuit,EnumCircuitType.ANALOG.ordinal(), 1, 4, 1), + weighted(ModItems.circuit, EnumCircuitType.CAPACITOR.ordinal(), 1, 1, 3), + }; + }}; } } diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 1adbc375b..e832c102a 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -79,7 +79,7 @@ public class ItemEnums { } public static enum EnumSecretType { - CANISTER, CONTROLLER, SELENIUM_STEEL + CANISTER, CONTROLLER, SELENIUM_STEEL, ABERRATOR } public static enum EnumCasingType { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 694b18910..38e67f3ea 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -570,7 +570,6 @@ public class ModItems { public static Item coil_magnetized_tungsten; public static Item coil_gold; public static Item coil_gold_torus; - public static Item magnet_circular; public static Item component_limiter; public static Item component_emitter; public static Item chlorine_pinwheel; @@ -585,14 +584,6 @@ public class ModItems { public static ItemEnumMulti circuit_star_component; public static Item circuit_star; - public static Item mechanism_revolver_1; - public static Item mechanism_revolver_2; - public static Item mechanism_rifle_1; - public static Item mechanism_rifle_2; - public static Item mechanism_launcher_1; - public static Item mechanism_launcher_2; - public static Item mechanism_special; - public static Item assembly_nuke; public static Item casing; @@ -1864,6 +1855,10 @@ public class ModItems { public static Item dns_plate; public static Item dns_legs; public static Item dns_boots; + public static Item taurun_helmet; + public static Item taurun_plate; + public static Item taurun_legs; + public static Item taurun_boots; public static Item trenchmaster_helmet; public static Item trenchmaster_plate; public static Item trenchmaster_legs; @@ -2747,7 +2742,6 @@ public class ModItems { coil_magnetized_tungsten = new Item().setUnlocalizedName("coil_magnetized_tungsten").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_magnetized_tungsten"); coil_gold = new Item().setUnlocalizedName("coil_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold"); coil_gold_torus = new Item().setUnlocalizedName("coil_gold_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold_torus"); - magnet_circular = new Item().setUnlocalizedName("magnet_circular").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":magnet_circular"); component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); @@ -2832,13 +2826,6 @@ public class ModItems { circuit_star_piece = (ItemEnumMulti) new ItemEnumMulti(ScrapType.class, true, true).setUnlocalizedName("circuit_star_piece").setCreativeTab(null); circuit_star_component = (ItemEnumMulti) new ItemCircuitStarComponent().setUnlocalizedName("circuit_star_component").setCreativeTab(null); circuit_star = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("circuit_star").setCreativeTab(null).setTextureName(RefStrings.MODID + ":circuit_star"); - mechanism_revolver_1 = new Item().setUnlocalizedName("mechanism_revolver_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_1"); - mechanism_revolver_2 = new Item().setUnlocalizedName("mechanism_revolver_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_3"); - mechanism_rifle_1 = new Item().setUnlocalizedName("mechanism_rifle_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_2"); - mechanism_rifle_2 = new Item().setUnlocalizedName("mechanism_rifle_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_4"); - mechanism_launcher_1 = new Item().setUnlocalizedName("mechanism_launcher_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_5"); - mechanism_launcher_2 = new Item().setUnlocalizedName("mechanism_launcher_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_6"); - mechanism_special = new Item().setUnlocalizedName("mechanism_special").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_7"); assembly_nuke = new Item().setUnlocalizedName("assembly_nuke").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_nuke"); casing = new ItemEnumMulti(ItemEnums.EnumCasingType.class, true, true).setUnlocalizedName("casing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing"); @@ -4495,6 +4482,16 @@ public class ModItems { dns_legs = new ArmorDNT(aMatDNS, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", 1000000000, 1000000, 100000, 115).cloneStats((ArmorFSB) dns_helmet).setUnlocalizedName("dns_legs").setTextureName(RefStrings.MODID + ":dns_legs"); dns_boots = new ArmorDNT(aMatDNS, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", 1000000000, 1000000, 100000, 115).cloneStats((ArmorFSB) dns_helmet).setUnlocalizedName("dns_boots").setTextureName(RefStrings.MODID + ":dns_boots"); + ArmorMaterial aMatTaurun = EnumHelper.addArmorMaterial("HBM_TRENCH", 150, new int[] { 3, 8, 6, 3 }, 100); + aMatTaurun.customCraftingMaterial = ModItems.plate_iron; + taurun_helmet = new ArmorTaurun(aMatTaurun, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png") + .addEffect(new PotionEffect(Potion.damageBoost.id, 20, 0)) + .setStepSize(1) + .hides(EnumPlayerPart.HAT) + .setUnlocalizedName("taurun_helmet").setTextureName(RefStrings.MODID + ":taurun_helmet"); + taurun_plate = new ArmorTaurun(aMatTaurun, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_plate").setTextureName(RefStrings.MODID + ":taurun_plate"); + taurun_legs = new ArmorTaurun(aMatTaurun, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_legs").setTextureName(RefStrings.MODID + ":taurun_legs"); + taurun_boots = new ArmorTaurun(aMatTaurun, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_boots").setTextureName(RefStrings.MODID + ":taurun_boots"); ArmorMaterial aMatTrench = EnumHelper.addArmorMaterial("HBM_TRENCH", 150, new int[] { 3, 8, 6, 3 }, 100); aMatTrench.customCraftingMaterial = ModItems.plate_iron; trenchmaster_helmet = new ArmorTrenchmaster(aMatTrench, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png") @@ -4940,11 +4937,11 @@ public class ModItems { multitool_joule = new ItemMultitoolPassive().setUnlocalizedName("multitool_joule").setCreativeTab(null).setTextureName(RefStrings.MODID + ":multitool_fist"); multitool_decon = new ItemMultitoolPassive().setUnlocalizedName("multitool_decon").setCreativeTab(null).setTextureName(RefStrings.MODID + ":multitool_fist"); - saw = new ModSword(MainRegistry.enumToolMaterialSaw).setUnlocalizedName("weapon_saw").setFull3D().setTextureName(RefStrings.MODID + ":saw"); - bat = new ModSword(MainRegistry.enumToolMaterialBat).setUnlocalizedName("weapon_bat").setFull3D().setTextureName(RefStrings.MODID + ":bat"); - bat_nail = new ModSword(MainRegistry.enumToolMaterialBatNail).setUnlocalizedName("weapon_bat_nail").setFull3D().setTextureName(RefStrings.MODID + ":bat_nail"); - golf_club = new ModSword(MainRegistry.enumToolMaterialGolfClub).setUnlocalizedName("weapon_golf_club").setFull3D().setTextureName(RefStrings.MODID + ":golf_club"); - pipe_rusty = new ModSword(MainRegistry.enumToolMaterialPipeRusty).setUnlocalizedName("weapon_pipe_rusty").setFull3D().setTextureName(RefStrings.MODID + ":pipe_rusty"); + saw = new ModSword(MainRegistry.enumToolMaterialSaw).setUnlocalizedName("weapon_saw").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":saw"); + bat = new ModSword(MainRegistry.enumToolMaterialBat).setUnlocalizedName("weapon_bat").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":bat"); + bat_nail = new ModSword(MainRegistry.enumToolMaterialBatNail).setUnlocalizedName("weapon_bat_nail").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":bat_nail"); + golf_club = new ModSword(MainRegistry.enumToolMaterialGolfClub).setUnlocalizedName("weapon_golf_club").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":golf_club"); + pipe_rusty = new ModSword(MainRegistry.enumToolMaterialPipeRusty).setUnlocalizedName("weapon_pipe_rusty").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":pipe_rusty"); pipe_lead = new ModSword(MainRegistry.enumToolMaterialPipeLead).setUnlocalizedName("weapon_pipe_lead").setFull3D().setTextureName(RefStrings.MODID + ":pipe_lead"); reer_graar = new ModSword(MainRegistry.tMatTitan).setUnlocalizedName("reer_graar").setFull3D().setTextureName(RefStrings.MODID + ":reer_graar_hd"); stopsign = new WeaponSpecial(MainRegistry.tMatAlloy).setUnlocalizedName("stopsign").setTextureName(RefStrings.MODID + ":stopsign"); @@ -5562,7 +5559,6 @@ public class ModItems { GameRegistry.registerItem(motor_desh, motor_desh.getUnlocalizedName()); GameRegistry.registerItem(motor_bismuth, motor_bismuth.getUnlocalizedName()); GameRegistry.registerItem(centrifuge_element, centrifuge_element.getUnlocalizedName()); - GameRegistry.registerItem(magnet_circular, magnet_circular.getUnlocalizedName()); GameRegistry.registerItem(reactor_core, reactor_core.getUnlocalizedName()); GameRegistry.registerItem(rtg_unit, rtg_unit.getUnlocalizedName()); GameRegistry.registerItem(levitation_unit, levitation_unit.getUnlocalizedName()); @@ -5669,15 +5665,6 @@ public class ModItems { GameRegistry.registerItem(circuit_star_component, circuit_star_component.getUnlocalizedName()); GameRegistry.registerItem(circuit_star, circuit_star.getUnlocalizedName()); - //Gun Mechanisms - GameRegistry.registerItem(mechanism_revolver_1, mechanism_revolver_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_revolver_2, mechanism_revolver_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_rifle_1, mechanism_rifle_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_rifle_2, mechanism_rifle_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_launcher_1, mechanism_launcher_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_launcher_2, mechanism_launcher_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_special, mechanism_special.getUnlocalizedName()); - //Casing GameRegistry.registerItem(casing, casing.getUnlocalizedName()); @@ -7023,6 +7010,10 @@ public class ModItems { GameRegistry.registerItem(dns_plate, dns_plate.getUnlocalizedName()); GameRegistry.registerItem(dns_legs, dns_legs.getUnlocalizedName()); GameRegistry.registerItem(dns_boots, dns_boots.getUnlocalizedName()); + GameRegistry.registerItem(taurun_helmet, taurun_helmet.getUnlocalizedName()); + GameRegistry.registerItem(taurun_plate, taurun_plate.getUnlocalizedName()); + GameRegistry.registerItem(taurun_legs, taurun_legs.getUnlocalizedName()); + GameRegistry.registerItem(taurun_boots, taurun_boots.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_helmet, trenchmaster_helmet.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_plate, trenchmaster_plate.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_legs, trenchmaster_legs.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorTaurun.java b/src/main/java/com/hbm/items/armor/ArmorTaurun.java new file mode 100644 index 000000000..d927935b4 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ArmorTaurun.java @@ -0,0 +1,34 @@ +package com.hbm.items.armor; + +import com.hbm.render.model.ModelArmorTaurun; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public class ArmorTaurun extends ArmorFSB { + + public ArmorTaurun(ArmorMaterial material, int slot, String texture) { + super(material, slot, texture); + this.setMaxDamage(0); + } + + @SideOnly(Side.CLIENT) + ModelArmorTaurun[] models; + + @Override + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { + + if(models == null) { + models = new ModelArmorTaurun[4]; + + for(int i = 0; i < 4; i++) + models[i] = new ModelArmorTaurun(i); + } + + return models[armorSlot]; + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java b/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java index e50dbcd66..2b252f2ff 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java @@ -16,7 +16,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; public class ItemRBMKPellet extends ItemNuclearWaste { - + public String fullName = ""; protected boolean hasXenon = true; @@ -26,12 +26,16 @@ public class ItemRBMKPellet extends ItemNuclearWaste { this.setMaxDamage(0); this.setCreativeTab(MainRegistry.controlTab); } - + public ItemRBMKPellet disableXenon() { this.hasXenon = false; return this; } + public boolean isXenonEnabled() { + return hasXenon; + } + @Override @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs tabs, List list) { @@ -39,10 +43,10 @@ public class ItemRBMKPellet extends ItemNuclearWaste { list.add(new ItemStack(item, 1, i)); } } - + @SideOnly(Side.CLIENT) private IIcon[] enrichmentOverlays; - + @SideOnly(Side.CLIENT) private IIcon xenonOverlay; @@ -50,13 +54,13 @@ public class ItemRBMKPellet extends ItemNuclearWaste { @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister iconRegister) { super.registerIcons(iconRegister); - + this.enrichmentOverlays = new IIcon[5]; - + for(int i = 0; i < enrichmentOverlays.length; i++) { enrichmentOverlays[i] = iconRegister.registerIcon("hbm:rbmk_pellet_overlay_e" + i); } - + if(this.hasXenon) xenonOverlay = iconRegister.registerIcon("hbm:rbmk_pellet_overlay_xenon"); } @@ -71,16 +75,16 @@ public class ItemRBMKPellet extends ItemNuclearWaste { public int getRenderPasses(int meta) { return hasXenon(meta) ? 3 : 2; } - + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { super.addInformation(stack, player, list, bool); list.add(EnumChatFormatting.ITALIC + this.fullName); list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "Pellet for recycling"); - + int meta = rectify(stack.getItemDamage()); - + switch(meta % 5) { case 0: list.add(EnumChatFormatting.GOLD + "Brand New"); break; case 1: list.add(EnumChatFormatting.YELLOW + "Barely Depleted"); break; @@ -88,7 +92,7 @@ public class ItemRBMKPellet extends ItemNuclearWaste { case 3: list.add(EnumChatFormatting.DARK_GREEN + "Highly Depleted"); break; case 4: list.add(EnumChatFormatting.DARK_GRAY + "Fully Depleted"); break; } - + if(hasXenon(meta)) list.add(EnumChatFormatting.DARK_PURPLE + "High Xenon Poison"); } @@ -96,20 +100,20 @@ public class ItemRBMKPellet extends ItemNuclearWaste { @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamageForRenderPass(int meta, int pass) { - + if(pass == 0) return this.itemIcon; - + if(pass == 2) return this.xenonOverlay; - + return this.enrichmentOverlays[rectify(meta) % 5]; } - + public static boolean hasXenon(int meta) { return rectify(meta) >= 5; } - + public static int rectify(int meta) { return Math.abs(meta) % 10; } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 895c788c6..59635dcdd 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -1,5 +1,6 @@ package com.hbm.items.machine; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.function.BiFunction; @@ -20,7 +21,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class ItemRBMKRod extends Item { - + public ItemRBMKPellet pellet; public String fullName = ""; //full name of the fuel rod public double reactivity; //endpoint of the function @@ -35,7 +36,7 @@ public class ItemRBMKRod extends Item { public double diffusion = 0.02D; //the speed at which the core heats the hull public NType nType = NType.SLOW; //neutronType, the most efficient neutron type for fission public NType rType = NType.FAST; //releaseType, the type of neutrons released by this fuel - + /* _____ * ,I I I I, * |'-----'| @@ -52,18 +53,22 @@ public class ItemRBMKRod extends Item { * | | * '-----' * I I I I - * + * * i drew a fuel rod yay */ + public static List craftableRods = new ArrayList<>(); + public ItemRBMKRod(ItemRBMKPellet pellet) { this(pellet.fullName); this.pellet = pellet; + + craftableRods.add(this); } public ItemRBMKRod(String fullName) { this.fullName = fullName; - + this.setContainerItem(ModItems.rbmk_fuel_empty); this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.controlTab); @@ -93,7 +98,7 @@ public class ItemRBMKRod extends Item { this.depFunc = func; return this; } - + public ItemRBMKRod setXenon(double gen, double burn) { this.xGen = gen; this.xBurn = burn; @@ -120,7 +125,7 @@ public class ItemRBMKRod extends Item { this.rType = rType; return this; } - + /** * Adjusts the input flux using the poison level * Generates, then burns poison @@ -131,82 +136,82 @@ public class ItemRBMKRod extends Item { * @return outFlux */ public double burn(World world, ItemStack stack, double inFlux) { - + inFlux += selfRate; - + //if xenon poison is enabled if(RBMKDials.getXenon(world)) { double xenon = getPoison(stack); xenon -= xenonBurnFunc(inFlux); - + inFlux *= (1D - getPoisonLevel(stack)); - + xenon += xenonGenFunc(inFlux); - + if(xenon < 0D) xenon = 0D; if(xenon > 100D) xenon = 100D; - + setPoison(stack, xenon); } - + double outFlux = reactivityFunc(inFlux, getEnrichment(stack)) * RBMKDials.getReactivityMod(world); //if depletion is enabled if(RBMKDials.getDepletion(world)) { double y = getYield(stack); y -= inFlux; - + if(y < 0D) y = 0D; - + setYield(stack, y); } - + double coreHeat = this.getCoreHeat(stack); coreHeat += outFlux * heat; - + this.setCoreHeat(stack, rectify(coreHeat)); - + return outFlux; } - + private double rectify(double num) { - + if(num > 1_000_000D) num = 1_000_000D; if(num < 20D || Double.isNaN(num)) num = 20D; - + return num; } - + /** * Heat up the core based on the outFlux, then move some heat to the hull * @param stack */ public void updateHeat(World world, ItemStack stack, double mod) { - + double coreHeat = this.getCoreHeat(stack); double hullHeat = this.getHullHeat(stack); - + if(coreHeat > hullHeat) { - + double mid = (coreHeat - hullHeat) / 2D; - + coreHeat -= mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; hullHeat += mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; - + this.setCoreHeat(stack, rectify(coreHeat)); this.setHullHeat(stack, rectify(hullHeat)); } } - + /** * return one tick's worth of heat and cool the hull of the fuel rod, this heat goes into the fuel rod assembly block * @param stack * @return */ public double provideHeat(World world, ItemStack stack, double heat, double mod) { - + double hullHeat = this.getHullHeat(stack); - + //metldown! the hull melts so the entire structure stops making sense //hull and core heats are instantly equalized into 33% of their sum each, //the rest is sent to the component which is always fatal @@ -217,20 +222,20 @@ public class ItemRBMKRod extends Item { this.setHullHeat(stack, avg); return avg - heat; } - + if(hullHeat <= heat) return 0; - + double ret = (hullHeat - heat) / 2; - + ret *= RBMKDials.getFuelHeatProvision(world) * mod; - + hullHeat -= ret; this.setHullHeat(stack, hullHeat); - + return ret; } - + public static enum EnumBurnFunc { PASSIVE(EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"), //const, no reactivity LOG_TEN(EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"), //log10(x + 1) * reactivity * 50 @@ -241,22 +246,22 @@ public class ItemRBMKRod extends Item { LINEAR(EnumChatFormatting.RED + "DANGEROUS / LINEAR"), //x * reactivity QUADRATIC(EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"), //x^2 / 100 * reactivity EXPERIMENTAL(EnumChatFormatting.RED + "EXPERIMENTAL / SINE SLOPE"); //x * (sin(x) + 1) - + public String title = ""; - + private EnumBurnFunc(String title) { this.title = title; } } - + /** * @param enrichment [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double in, double enrichment) { - + double flux = in * reactivityModByEnrichment(enrichment); - + switch(this.function) { case PASSIVE: return selfRate * enrichment; case LOG_TEN: return Math.log10(flux + 1) * 0.5D * reactivity; @@ -268,20 +273,20 @@ public class ItemRBMKRod extends Item { case QUADRATIC: return flux * flux / 10000D * reactivity; case EXPERIMENTAL: return flux * (Math.sin(flux) + 1) * reactivity; } - + return 0; } - + public String getFuncDescription(ItemStack stack) { - + String function; - + switch(this.function) { case PASSIVE: function = EnumChatFormatting.RED + "" + selfRate; break; case LOG_TEN: function = "log10(%1$s + 1) * 0.5 * %2$s"; break; - case PLATEU: function = "(1 - e^-%1$s / 25)) * %2$s"; + case PLATEU: function = "(1 - e^(-%1$s / 25)) * %2$s"; break; case ARCH: function = "(%1$s - %1$s² / 10000) / 100 * %2$s [0;∞]"; break; @@ -297,20 +302,20 @@ public class ItemRBMKRod extends Item { break; default: function = "ERROR"; } - + double enrichment = getEnrichment(stack); - + if(enrichment < 1) { enrichment = reactivityModByEnrichment(enrichment); String reactivity = EnumChatFormatting.YELLOW + "" + ((int)(this.reactivity * enrichment * 1000D) / 1000D) + EnumChatFormatting.WHITE; String enrichmentPer = EnumChatFormatting.GOLD + " (" + ((int)(enrichment * 1000D) / 10D) + "%)"; - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity).concat(enrichmentPer); } - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity); } - + public static enum EnumDepleteFunc { LINEAR, //old function RAISING_SLOPE, //for breeding fuels such as MEU, maximum of 110% at 28% depletion @@ -318,9 +323,9 @@ public class ItemRBMKRod extends Item { GENTLE_SLOPE, //recommended for most fuels, maximum barely over the start, near the beginning STATIC; //for arcade-style neutron sources } - + public double reactivityModByEnrichment(double enrichment) { - + switch(this.depFunc) { default: case LINEAR: return enrichment; @@ -330,7 +335,7 @@ public class ItemRBMKRod extends Item { case GENTLE_SLOPE: return enrichment + (Math.sin(enrichment * Math.PI) / 3D); //x + (sin(x * pi) / 3) also works } } - + /** * Xenon generated per tick, linear function * @param flux @@ -339,7 +344,7 @@ public class ItemRBMKRod extends Item { public double xenonGenFunc(double flux) { return flux * xGen; } - + /** * Xenon burned away per tick, quadratic function * @param flux @@ -348,7 +353,7 @@ public class ItemRBMKRod extends Item { public double xenonBurnFunc(double flux) { return (flux * flux) / xBurn; } - + /** * @param stack * @return enrichment [0;1] @@ -356,7 +361,7 @@ public class ItemRBMKRod extends Item { public static double getEnrichment(ItemStack stack) { return getYield(stack) / ((ItemRBMKRod) stack.getItem()).yield; } - + /** * @param stack * @return poison [0;1] @@ -415,15 +420,19 @@ public class ItemRBMKRod extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + list.add(EnumChatFormatting.ITALIC + this.fullName); - + if(this == ModItems.rbmk_fuel_drx) { - + + if(ItemRBMKRod.getHullHeat(stack) >= 50 || ItemRBMKRod.getCoreHeat(stack) >= 50) { + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); + } + if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmx.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmx.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmx.splitsWith", I18nUtil.resolveKey(nType.unlocalized + ".x"))); @@ -437,13 +446,17 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmx.melt", meltingPoint + "m")); - + } else { + if(ItemRBMKRod.getHullHeat(stack) >= 50 || ItemRBMKRod.getCoreHeat(stack) >= 50) { + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); + } + if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmk.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000D)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmk.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmk.splitsWith", I18nUtil.resolveKey(nType.unlocalized))); @@ -471,10 +484,10 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + "Skin temp: " + ((int)(getHullHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.RED + "Core temp: " + ((int)(getCoreHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.DARK_RED + "Melting point: " + meltingPoint + "°C");*/ - + super.addInformation(stack, player, list, bool); } - + /* __ __ ____ ________ * | \ | | | __ \ |__ __| * | \ | | | |__| | | | @@ -482,40 +495,40 @@ public class ItemRBMKRod extends Item { * | | \ | | |__| | | | * |__| \__| |_____/ |__| */ - + public static void setYield(ItemStack stack, double yield) { setDouble(stack, "yield", yield); } - + public static double getYield(ItemStack stack) { - + if(stack.getItem() instanceof ItemRBMKRod) { return getDouble(stack, "yield"); } - + return 0; } - + public static void setPoison(ItemStack stack, double xenon) { setDouble(stack, "xenon", xenon); } - + public static double getPoison(ItemStack stack) { return getDouble(stack, "xenon"); } - + public static void setCoreHeat(ItemStack stack, double heat) { setDouble(stack, "core", heat); } - + public static double getCoreHeat(ItemStack stack) { return getDouble(stack, "core"); } - + public static void setHullHeat(ItemStack stack, double heat) { setDouble(stack, "hull", heat); } - + public static double getHullHeat(ItemStack stack) { return getDouble(stack, "hull"); } @@ -529,23 +542,23 @@ public class ItemRBMKRod extends Item { public double getDurabilityForDisplay(ItemStack stack) { return 1D - getEnrichment(stack); } - + public static void setDouble(ItemStack stack, String key, double yield) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); - + stack.stackTagCompound.setDouble(key, yield); } - + public static double getDouble(ItemStack stack, String key) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); return stack.stackTagCompound.getDouble(key); } - + /** * Sets up the default values for all NBT data because doing it one-by-one will only correctly set the first called value and the rest stays 0 which is very not good * @param stack @@ -557,7 +570,7 @@ public class ItemRBMKRod extends Item { setCoreHeat(stack, 20.0D); setHullHeat(stack, 20.0D); } - + @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { setNBTDefaults(stack); //minimize the window where NBT screwups can happen diff --git a/src/main/java/com/hbm/items/tool/ItemWand.java b/src/main/java/com/hbm/items/tool/ItemWand.java index 9bb6dc6ca..69d05195d 100644 --- a/src/main/java/com/hbm/items/tool/ItemWand.java +++ b/src/main/java/com/hbm/items/tool/ItemWand.java @@ -2,8 +2,11 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.blocks.ModBlocks; + import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -11,98 +14,87 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; public class ItemWand extends Item { - + + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { list.add("Creative-only item"); list.add("\"Destruction brings creation\""); list.add("(Set positions with right click,"); list.add("set block with shift-right click!)"); - - if(itemstack.stackTagCompound != null && - !(itemstack.stackTagCompound.getInteger("x") == 0 && - itemstack.stackTagCompound.getInteger("y") == 0 && - itemstack.stackTagCompound.getInteger("z") == 0)) - { - list.add("Pos: " + itemstack.stackTagCompound.getInteger("x") + ", " + itemstack.stackTagCompound.getInteger("y") + ", " + itemstack.stackTagCompound.getInteger("z")); + + if(stack.stackTagCompound != null && !(stack.stackTagCompound.getInteger("x") == 0 && stack.stackTagCompound.getInteger("y") == 0 && stack.stackTagCompound.getInteger("z") == 0)) { + list.add("Pos: " + stack.stackTagCompound.getInteger("x") + ", " + stack.stackTagCompound.getInteger("y") + ", " + stack.stackTagCompound.getInteger("z")); } else { list.add("Positions not set!"); } - if(itemstack.stackTagCompound != null) - list.add("Block saved: " + Block.getBlockById(itemstack.stackTagCompound.getInteger("block")).getUnlocalizedName()); + if(stack.stackTagCompound != null) + list.add("Block saved: " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName()); } - + @Override - public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) - { - if(p_77648_1_.stackTagCompound == null) - { - p_77648_1_.stackTagCompound = new NBTTagCompound(); + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); } - - if(p_77648_2_.isSneaking()) - { - p_77648_1_.stackTagCompound.setInteger("block", Block.getIdFromBlock(p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_))); - p_77648_1_.stackTagCompound.setInteger("meta", p_77648_3_.getBlockMetadata(p_77648_4_, p_77648_5_, p_77648_6_)); - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(p_77648_1_.stackTagCompound.getInteger("block")).getUnlocalizedName())); + + if(player.isSneaking()) { + stack.stackTagCompound.setInteger("block", Block.getIdFromBlock(world.getBlock(x, y, z))); + stack.stackTagCompound.setInteger("meta", world.getBlockMetadata(x, y, z)); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName())); } else { - if(p_77648_1_.stackTagCompound.getInteger("x") == 0 && - p_77648_1_.stackTagCompound.getInteger("y") == 0 && - p_77648_1_.stackTagCompound.getInteger("z") == 0) - { - p_77648_1_.stackTagCompound.setInteger("x", p_77648_4_); - p_77648_1_.stackTagCompound.setInteger("y", p_77648_5_); - p_77648_1_.stackTagCompound.setInteger("z", p_77648_6_); - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Position set!")); + if(stack.stackTagCompound.getInteger("x") == 0 && stack.stackTagCompound.getInteger("y") == 0 && stack.stackTagCompound.getInteger("z") == 0) { + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Position set!")); } else { - - int x = p_77648_1_.stackTagCompound.getInteger("x"); - int y = p_77648_1_.stackTagCompound.getInteger("y"); - int z = p_77648_1_.stackTagCompound.getInteger("z"); - - p_77648_1_.stackTagCompound.setInteger("x", 0); - p_77648_1_.stackTagCompound.setInteger("y", 0); - p_77648_1_.stackTagCompound.setInteger("z", 0); - - if(!p_77648_3_.isRemote) - { - for(int i = Math.min(x, p_77648_4_); i <= Math.max(x, p_77648_4_); i++) - { - for(int j = Math.min(y, p_77648_5_); j <= Math.max(y, p_77648_5_); j++) - { - for(int k = Math.min(z, p_77648_6_); k <= Math.max(z, p_77648_6_); k++) - { - p_77648_3_.setBlock(i, j, k, Block.getBlockById(p_77648_1_.stackTagCompound.getInteger("block")), p_77648_1_.stackTagCompound.getInteger("meta"), 3); + + int ox = stack.stackTagCompound.getInteger("x"); + int oy = stack.stackTagCompound.getInteger("y"); + int oz = stack.stackTagCompound.getInteger("z"); + + stack.stackTagCompound.setInteger("x", 0); + stack.stackTagCompound.setInteger("y", 0); + stack.stackTagCompound.setInteger("z", 0); + + if(!world.isRemote) { + Block block = Block.getBlockById(stack.stackTagCompound.getInteger("block")); + int meta = stack.stackTagCompound.getInteger("meta"); + boolean replaceAir = block == ModBlocks.wand_air; + + for(int i = Math.min(ox, x); i <= Math.max(ox, x); i++) { + for(int j = Math.min(oy, y); j <= Math.max(oy, y); j++) { + for(int k = Math.min(oz, z); k <= Math.max(oz, z); k++) { + if(replaceAir && world.getBlock(i, j, k) != Blocks.air) continue; + world.setBlock(i, j, k, block, meta, 3); } } } } - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Selection filled!")); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Selection filled!")); } } - - return true; - } + + return true; + } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - if(stack.stackTagCompound == null) - { + if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); } - if(player.isSneaking()) - { + if(player.isSneaking()) { stack.stackTagCompound.setInteger("block", 0); stack.stackTagCompound.setInteger("meta", 0); if(world.isRemote) player.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName())); } - + return stack; } -} +} \ No newline at end of file diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index ed086e56e..b0b659935 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -14,7 +14,6 @@ import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.interfaces.IItemHUD; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIWeaponTable; -import com.hbm.items.IEquipReceiver; import com.hbm.items.IKeybindReceiver; import com.hbm.items.weapon.sedna.hud.IHUDComponent; import com.hbm.items.weapon.sedna.mags.IMagazine; @@ -48,7 +47,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipReceiver, IItemHUD { +public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD { /** Timestamp for rendering smoke nodes and muzzle flashes */ public long[] lastShot; @@ -96,6 +95,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei public static final String KEY_LOCKONTARGET = "lockontarget"; public static final String KEY_LOCKEDON = "lockedon"; public static final String KEY_CANCELRELOAD = "cancel"; + public static final String KEY_EQUIPPED = "eqipped"; public static ConcurrentHashMap loopedSounds = new ConcurrentHashMap(); @@ -228,7 +228,6 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei } } - @Override public void onEquip(EntityPlayer player, ItemStack stack) { for(int i = 0; i < this.configs_DNA.length; i++) { playAnimation(player, stack, AnimType.EQUIP, i); @@ -291,6 +290,17 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei return; } + /// ON EQUIP /// + if(player != null) { + boolean wasHeld = this.getIsEquipped(stack); + + if(!wasHeld && isHeld && player != null) { + this.onEquip(player, stack); + } + } + + this.setIsEquipped(stack, isHeld); + /// RESET WHEN NOT EQUIPPED /// if(!isHeld) { for(int i = 0; i < confNo; i++) { @@ -359,6 +369,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei // RELOAD CANCEL // public static boolean getReloadCancel(ItemStack stack) { return getValueBool(stack, KEY_CANCELRELOAD); } public static void setReloadCancel(ItemStack stack, boolean value) { setValueBool(stack, KEY_CANCELRELOAD, value); } + // EQUIPPED // + public static boolean getIsEquipped(ItemStack stack) { return getValueBool(stack, KEY_EQUIPPED); } + public static void setIsEquipped(ItemStack stack, boolean value) { setValueBool(stack, KEY_EQUIPPED, value); } /// UTIL /// diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index ff80ce43c..f456c204e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -139,7 +139,8 @@ public class GunFactory { } public static enum EnumModTest { - FIRERATE, DAMAGE, MULTI; + FIRERATE, DAMAGE, MULTI, + OVERRIDE_2_5, OVERRIDE_5, OVERRIDE_7_5, OVERRIDE_10, OVERRIDE_12_5, OVERRIDE_15, OVERRIDE_20; } public static enum EnumModGeneric { @@ -158,7 +159,7 @@ public class GunFactory { SILENCER, SCOPE, SAW, GREASEGUN, SLOWDOWN, SPEEDUP, CHOKE, SPEEDLOADER, FURNITURE_GREEN, FURNITURE_BLACK, BAYONET, - STACK_MAG, + STACK_MAG, SKIN_SATURNITE, } public static enum EnumModCaliber { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index 557123942..cceceed9e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -920,7 +920,7 @@ public class Orchestras { if(type == AnimType.CYCLE) { if(timer == 0) { - int rounds = WeaponModManager.hasUpgrade(stack, ctx.configIndex, 208) ? 2 : 1; + int rounds = WeaponModManager.hasUpgrade(stack, ctx.configIndex, WeaponModManager.ID_MINIGUN_SPEED) ? 3 : 1; for(int i = 0; i < rounds; i++) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, aiming ? 0.125 : 0.5, aiming ? -0.125 : -0.25, aiming ? -0.25 : -0.5D, 0, 0.18, -0.12, 0.01, (float)entity.getRNG().nextGaussian() * 15F, (float)entity.getRNG().nextGaussian() * 15F, casing.getName()); @@ -1301,7 +1301,7 @@ public class Orchestras { if(timer == 1) { int cba = (stack.getItem() == ModItems.gun_aberrator_eott && ctx.configIndex == 0) ? -1 : 1; SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); - if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D * cba, -0.05, 0.25, -0.05 * cba, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 10F, (float)entity.getRNG().nextGaussian() * 12.5F, casing.getName()); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.5, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D * cba, -0.05, 0.25, -0.05 * cba, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 10F, (float)entity.getRNG().nextGaussian() * 12.5F, casing.getName()); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index e875b7800..c452655d3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -35,7 +35,7 @@ public class XFactory10ga { public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 1.5F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java index 1dded0aab..e67396128 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java @@ -36,7 +36,7 @@ public class XFactory50 { public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 3.5F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java index 4aafb28ea..d59d23a9e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java @@ -111,7 +111,7 @@ public class XFactory556mm { .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); case CYCLE: return new BusAnimation() .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 20).addPos(0, 0, -4.5, 40).addPos(0, 0, 0, 40)) - .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.5 : -0.75, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_FULL)); + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, (ItemGunBaseNT.getIsAiming(stack) || !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_NO_STOCK)) ? -0.25 : -0.75, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_FULL)); case CYCLE_DRY: return new BusAnimation() .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -0.3125, 100).hold(25).addPos(0, 0, -2.75, 130).hold(50).addPos(0, 0, -2.4375, 50).addPos(0, 0, 0, 85)) .addBus("PLUG", new BusAnimationSequence().addPos(0, 0, 0, 250).hold(125).addPos(0, 0, -2.4375, 130).hold(100).addPos(0, 0, 0, 85)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java index 92d47c361..1638a2794 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java @@ -3,6 +3,8 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -19,7 +21,9 @@ import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; public class XFactory75Bolt { @@ -27,15 +31,29 @@ public class XFactory75Bolt { public static BulletConfig b75_inc; public static BulletConfig b75_exp; + public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; + Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + }; + public static BiConsumer LAMBDA_INC = (bullet, mop) -> { + if(mop.entityHit != null && mop.entityHit instanceof EntityLivingBase) { + HbmLivingProps data = HbmLivingProps.getData((EntityLivingBase) mop.entityHit); + if(data.phosphorus < 300) data.phosphorus = 300; + } + }; + public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { + Lego.standardExplode(bullet, mop, 5F); bullet.setDead(); + }; + public static void init() { SpentCasing casing75 = new SpentCasing(CasingType.STRAIGHT).setColor(SpentCasing.COLOR_CASE_BRASS).setScale(2F, 2F, 1.5F); b75 = new BulletConfig().setItem(EnumAmmo.B75) - .setCasing(casing75.clone().register("b75")); + .setCasing(casing75.clone().register("b75")).setOnImpact(LAMBDA_TINY_EXPLODE); b75_inc = new BulletConfig().setItem(EnumAmmo.B75_INC).setDamage(0.8F).setArmorPiercing(0.1F) - .setCasing(casing75.clone().register("b75inc")); + .setCasing(casing75.clone().register("b75inc")).setOnImpact(LAMBDA_INC); b75_exp = new BulletConfig().setItem(EnumAmmo.B75_EXP).setDamage(1.5F).setArmorPiercing(-0.25F) - .setCasing(casing75.clone().register("b75exp")); + .setCasing(casing75.clone().register("b75exp")).setOnImpact(LAMBDA_STANDARD_EXPLODE); ModItems.gun_bolter = new ItemGunBaseNT(WeaponQuality.SPECIAL, new GunConfig() .dura(3_000).draw(20).inspect(31).crosshair(Crosshair.L_CIRCLE).smoke(LAMBDA_SMOKE) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java index eb7b7b79e..b87fba86d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java @@ -43,7 +43,7 @@ public class XFactory762mm { public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 1.5F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java index 0cd151888..e8749552f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java @@ -15,6 +15,7 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.GunState; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.MainRegistry; @@ -25,7 +26,10 @@ import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.util.EntityDamageUtil; +import com.hbm.util.DamageResistanceHandler.DamageClass; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; public class XFactory9mm { @@ -64,7 +68,7 @@ public class XFactory9mm { .dmg(25F).delay(4).dry(10).spread(0.005F).reload(53).jam(44).sound("hbm:weapon.fire.pistol", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 17).addConfigs(p9_sp, p9_fmj, p9_jhp, p9_ap)) .offset(1, -0.0625 * 2.5, -0.25D) - .setupStandardFire().recoil(LAMBDA_RECOIL_LAG)) + .setupStandardFire().fire(LAMBDA_FIRE_LAG).recoil(LAMBDA_RECOIL_LAG)) .setupStandardConfiguration() .anim(LAMBDA_LAG_ANIMS).orchestra(Orchestras.ORCHESTRA_LAG) ).setUnlocalizedName("gun_lag"); @@ -133,6 +137,27 @@ public class XFactory9mm { GunStateDecider.deciderAutoRefire(stack, ctx, lastState, 0, index, () -> { return ItemGunBaseNT.getSecondary(stack, index) && ItemGunBaseNT.getMode(stack, ctx.configIndex) == 0; }); }; + public static BiConsumer LAMBDA_FIRE_LAG = (stack, ctx) -> { + AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); + int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + EntityPlayer player = ctx.getPlayer(); + if(player != null && type == AnimType.INSPECT && timer > 20 && timer < 60) { + int index = ctx.configIndex; + Receiver primary = ctx.config.getReceivers(stack)[0]; + IMagazine mag = primary.getMagazine(stack); + BulletConfig config = (BulletConfig) mag.getType(stack, ctx.inventory); + player.addStat(MainRegistry.statBullets, 1); + mag.useUpAmmo(stack, ctx.inventory, 1); + ItemGunBaseNT.setWear(stack, index, Math.min(ItemGunBaseNT.getWear(stack, index) + config.wear, ctx.config.getDurability(stack))); + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, primary.getFireSound(stack), primary.getFireVolume(stack), primary.getFirePitch(stack)); + ItemGunBaseNT.setState(stack, index, GunState.COOLDOWN); + ItemGunBaseNT.setTimer(stack, index, primary.getDelayAfterFire(stack)); + EntityDamageUtil.attackEntityFromNT(player, BulletConfig.getDamage(player, player, DamageClass.PHYSICAL), 1_000F, true, false, 1D, 5F, 0F); + } else { + Lego.doStandardFire(stack, ctx, AnimType.CYCLE, true); + } + }; + public static BiConsumer LAMBDA_SMOKE = (stack, ctx) -> { Lego.handleStandardSmoke(ctx.entity, stack, 2000, 0.05D, 1.1D, ctx.configIndex); }; diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java index d9698f42f..fe742a0a3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java @@ -132,9 +132,9 @@ public class XFactoryEnergy { energy_las_ir = new BulletConfig().setItem(EnumAmmo.CAPACITOR_IR).setCasing(new ItemStack(ModItems.ingot_polymer, 2), 4).setupDamageClass(DamageClass.FIRE).setBeam().setSpread(0.0F).setLife(5).setRenderRotations(false).setOnBeamImpact(LAMBDA_IR_HIT); ModItems.gun_tesla_cannon = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() - .dura(2_000).draw(10).inspect(33).reloadSequential(true).crosshair(Crosshair.CIRCLE) + .dura(2_000).draw(10).inspect(33).crosshair(Crosshair.CIRCLE) .rec(new Receiver(0) - .dmg(35F).delay(20).reload(44).jam(19).sound("hbm:weapon.fire.tesla", 1.0F, 1.0F) + .dmg(35F).delay(20).spreadHipfire(1.5F).reload(44).jam(19).sound("hbm:weapon.fire.tesla", 1.0F, 1.0F) .mag(new MagazineBelt().addConfigs(energy_tesla, energy_tesla_overcharge)) .offset(0.75, 0, -0.375).offsetScoped(0.75, 0, -0.25) .setupStandardFire().recoil(LAMBDA_RECOIL_ENERGY)) @@ -143,9 +143,9 @@ public class XFactoryEnergy { ).setUnlocalizedName("gun_tesla_cannon"); ModItems.gun_lasrifle = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() - .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).scopeTexture(scope_luna) + .dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).scopeTexture(scope_luna) .rec(new Receiver(0) - .dmg(50F).delay(8).reload(44).jam(36).sound("hbm:weapon.fire.laser", 1.0F, 1.0F) + .dmg(50F).delay(8).spreadHipfire(1F).reload(44).jam(36).sound("hbm:weapon.fire.laser", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 24).addConfigs(energy_las, energy_las_overcharge, energy_las_ir)) .offset(0.75, -0.0625 * 1.5, -0.1875) .setupStandardFire().recoil(LAMBDA_RECOIL_ENERGY)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java b/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java index 3dd6c6dc2..a6b959bc7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java @@ -10,4 +10,7 @@ public interface IWeaponMod { /** The meat and bones of the upgrade eval. Requires the base value, the held gun, the value's * identifier and the yet unmodified parent (i.e. if the value is part of the receiver, that receiver) */ public T eval(T base, ItemStack gun, String key, Object parent); + + public default void onInstall(ItemStack gun, ItemStack mod, int index) { } + public default void onUninstall(ItemStack gun, ItemStack mod, int index) { } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java index 1dbf1a4b0..1794a8cd4 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java @@ -4,10 +4,13 @@ import java.util.ArrayList; import java.util.List; import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; +import com.hbm.items.weapon.sedna.mags.MagazineSingleTypeBase; import net.minecraft.item.ItemStack; @@ -46,7 +49,6 @@ public class WeaponModCaliber extends WeaponModBase { return (T) DUMMY_FULL; } if(base instanceof MagazineBelt) { - MagazineBelt original = (MagazineBelt) base; DUMMY_BELT.acceptedBullets = cfg; return (T) DUMMY_BELT; } @@ -56,4 +58,17 @@ public class WeaponModCaliber extends WeaponModBase { } return base; } + + /* adding or removing a caliber mod annihilates the loaded rounds */ + public void onInstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } + public void onUninstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } + + public void clearMag(ItemStack stack, int index) { + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + IMagazine mag = gun.getConfig(stack, index).getReceivers(stack)[0].getMagazine(stack); + if(mag instanceof MagazineSingleTypeBase) { + MagazineSingleTypeBase mstb = (MagazineSingleTypeBase) mag; + mstb.setAmount(stack, 0); + } + } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index ba9bb3c46..f586acccc 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -58,13 +58,20 @@ public class WeaponModManager { new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.DAMAGE.ordinal())).addDefault(TEST_DAMAGE); new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.MULTI.ordinal())).addDefault(TEST_MULTI); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_2_5.ordinal())).addDefault(new WeaponModOverride(3, 2.5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_5.ordinal())).addDefault(new WeaponModOverride(4, 5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_7_5.ordinal())).addDefault(new WeaponModOverride(5, 7.5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_10.ordinal())).addDefault(new WeaponModOverride(6, 10F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_12_5.ordinal())).addDefault(new WeaponModOverride(7, 12_5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_15.ordinal())).addDefault(new WeaponModOverride(8, 15F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_20.ordinal())).addDefault(new WeaponModOverride(9, 20F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DAMAGE.ordinal())).addMod(ModItems.gun_pepperbox, new WeaponModGenericDamage(100)); new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DURA.ordinal())).addMod(ModItems.gun_pepperbox, new WeaponModGenericDurability(101)); Item[] steelGuns = new Item[] { ModItems.gun_light_revolver, ModItems.gun_light_revolver_atlas, - ModItems.gun_henry, - ModItems.gun_henry_lincoln, + ModItems.gun_henry, ModItems.gun_henry_lincoln, ModItems.gun_greasegun, ModItems.gun_maresleg, ModItems.gun_maresleg_akimbo, ModItems.gun_flaregun }; @@ -127,13 +134,14 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.GREASEGUN).addMod(ModItems.gun_greasegun, new WeaponModGreasegun(ID_GREASEGUN_CLEAN)); new WeaponModDefinition(EnumModSpecial.SLOWDOWN).addMod(ModItems.gun_minigun, new WeaponModSlowdown(207)); new WeaponModDefinition(EnumModSpecial.SPEEDUP) - .addMod(ModItems.gun_minigun, new WeaponModMinigunSpeedup(208)) + .addMod(ModItems.gun_minigun, new WeaponModMinigunSpeedup(ID_MINIGUN_SPEED)) .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12}, new WeaponModChoke(210)); new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); new WeaponModDefinition(EnumModSpecial.BAYONET).addMod(ModItems.gun_mas36, new WeaponModMASBayonet(ID_MAS_BAYONET)); new WeaponModDefinition(EnumModSpecial.STACK_MAG).addMod(new Item[] {ModItems.gun_greasegun, ModItems.gun_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_aberrator, ModItems.gun_aberrator_eott}, new WeaponModStackMag(214)); + new WeaponModDefinition(EnumModSpecial.SKIN_SATURNITE).addMod(new Item[] {ModItems.gun_uzi, ModItems.gun_uzi_akimbo}, new WeaponModUziSaturnite(ID_UZI_SATURN)); BulletConfig[] p9 = new BulletConfig[] {XFactory9mm.p9_sp, XFactory9mm.p9_fmj, XFactory9mm.p9_jhp, XFactory9mm.p9_ap}; BulletConfig[] p45 = new BulletConfig[] {XFactory45.p45_sp, XFactory45.p45_fmj, XFactory45.p45_jhp, XFactory45.p45_ap, XFactory45.p45_du}; @@ -150,7 +158,7 @@ public class WeaponModManager { .addMod(ModItems.gun_greasegun, new WeaponModCaliber(311, 24, 3F, p45)) .addMod(ModItems.gun_uzi, new WeaponModCaliber(312, 24, 3F, p45)) .addMod(ModItems.gun_uzi_akimbo, new WeaponModCaliber(313, 24, 3F, p45)) - .addMod(ModItems.gun_lag, new WeaponModCaliber(314, 24, 25F, p45)); + .addMod(ModItems.gun_lag, new WeaponModCaliber(314, 15, 25F, p45)); new WeaponModDefinition(EnumModCaliber.P22) .addMod(ModItems.gun_henry, new WeaponModCaliber(320, 28, 10F, p22)) .addMod(ModItems.gun_uzi, new WeaponModCaliber(321, 40, 3F, p22)) @@ -178,9 +186,11 @@ public class WeaponModManager { public static final int ID_NO_SHIELD = 204; public static final int ID_NO_STOCK = 205; public static final int ID_GREASEGUN_CLEAN = 206; + public static final int ID_MINIGUN_SPEED = 208; public static final int ID_FURNITURE_GREEN = 211; public static final int ID_FURNITURE_BLACK = 212; public static final int ID_MAS_BAYONET = 213; + public static final int ID_UZI_SATURN = 215; public static ItemStack[] getUpgradeItems(ItemStack stack, int cfg) { if(!stack.hasTagCompound()) return new ItemStack[0]; @@ -240,12 +250,29 @@ public class WeaponModManager { } } - public static boolean isApplicable(ItemStack gun, ItemStack mod, int cfg, boolean checkMutex) { - if(gun == null || mod == null) return false; //if either stacks are null + public static void onInstallStack(ItemStack gun, ItemStack mod, int cfg) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); + if(newMod == null) return; + newMod.onInstall(gun, mod, cfg); + } + + public static void onUninstallStack(ItemStack gun, ItemStack mod, int cfg) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); + if(newMod == null) return; + newMod.onUninstall(gun, mod, cfg); + } + + public static IWeaponMod modFromStack(ItemStack gun, ItemStack mod, int cfg) { + if(gun == null || mod == null) return null; WeaponModDefinition def = stackToMod.get(new ComparableStack(mod)); - if(def == null) return false; //if the mod stack doesn't have a mod definition - IWeaponMod newMod = def.modByGun.get(new ComparableStack(gun)); - if(newMod == null) newMod = def.modByGun.get(null); //if there's no per-gun mod, default to null key + if(def == null) return null; + IWeaponMod newMod = def.modByGun.get(new ComparableStack(gun).makeSingular()); //shift clicking causes the gun to have stack size 0! + if(newMod == null) newMod = def.modByGun.get(null); + return newMod; + } + + public static boolean isApplicable(ItemStack gun, ItemStack mod, int cfg, boolean checkMutex) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); if(newMod == null) return false; //if there's just no mod applicable if(checkMutex) for(int i : gun.stackTagCompound.getIntArray(KEY_MOD_LIST + cfg)) { diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java new file mode 100644 index 000000000..54f68163b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java @@ -0,0 +1,22 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModOverride extends WeaponModBase { + + protected final float baseDamage; + + public WeaponModOverride(int id, float baseDamage, String... slots) { + super(id, slots); + this.baseDamage = baseDamage; + this.setPriority(PRIORITY_SET); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_BASEDAMAGE) return cast(baseDamage, base); + return base; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java new file mode 100644 index 000000000..baba38d00 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java @@ -0,0 +1,22 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModUziSaturnite extends WeaponModBase { + + public WeaponModUziSaturnite(int id) { + super(id, "FURNITURE"); + this.setPriority(PRIORITY_ADDITIVE); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.F_DURABILITY) return cast((Float) base * 5F, base); + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base + 3F, base); + return base; + } + +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index d939975a4..317faa8d6 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5257)"; + public static final String VERSION = "1.0.27 BETA (5279)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 6928ba30b..6c0ac5d2a 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -6,7 +6,8 @@ import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; - import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; +import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.machine.Floodlight.TileEntityFloodlight; import com.hbm.blocks.machine.MachineFan.TileEntityFan; import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; @@ -201,6 +202,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFloodlight.class, new RenderFloodlight()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLoot.class, new RenderLoot()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPedestal.class, new RenderPedestalTile()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySkeletonHolder.class, new RenderSkeletonHolder()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBobble.class, new RenderBobble()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySnowglobe.class, new RenderSnowglobe()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPlushie.class, new RenderPlushie()); @@ -740,10 +742,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityRADBeast.class, new RenderRADBeast()); RenderingRegistry.registerEntityRenderingHandler(EntityBlockSpider.class, new RenderBlockSpider()); RenderingRegistry.registerEntityRenderingHandler(EntityUFO.class, new RenderUFO()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeZombie.class, new RenderSiegeZombie()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeUFO.class, new RenderSiegeUFO()); RenderingRegistry.registerEntityRenderingHandler(EntitySiegeCraft.class, new RenderSiegeCraft()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeSkeleton.class, new RenderSiegeSkeleton()); RenderingRegistry.registerEntityRenderingHandler(EntitySiegeTunneler.class, new RenderSiegeTunneler()); RenderingRegistry.registerEntityRenderingHandler(EntityGhost.class, new RenderGhost()); RenderingRegistry.registerEntityRenderingHandler(EntityGlyphid.class, new RenderGlyphid()); @@ -759,6 +758,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityPlasticBag.class, new RenderPlasticBag()); RenderingRegistry.registerEntityRenderingHandler(EntityPigeon.class, new RenderPigeon(new ModelPigeon(), 0.3F)); RenderingRegistry.registerEntityRenderingHandler(EntityDummy.class, new RenderDummy()); + RenderingRegistry.registerEntityRenderingHandler(EntityUndeadSoldier.class, new RenderUndeadSoldier()); //"particles" RenderingRegistry.registerEntityRenderingHandler(EntityChlorineFX.class, new MultiCloudRenderer(new Item[] { ModItems.chlorine1, ModItems.chlorine2, ModItems.chlorine3, ModItems.chlorine4, ModItems.chlorine5, ModItems.chlorine6, ModItems.chlorine7, ModItems.chlorine8 })); RenderingRegistry.registerEntityRenderingHandler(EntityPinkCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.pc1, ModItems.pc2, ModItems.pc3, ModItems.pc4, ModItems.pc5, ModItems.pc6, ModItems.pc7, ModItems.pc8 })); @@ -1760,7 +1760,7 @@ public class ClientProxy extends ServerProxy { .addPos(90, 0, 1, 800) .addPos(0, 0, 1, 50)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } /* crucible swing */ @@ -1782,7 +1782,7 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:weapon.cSwing"), 0.8F + player.getRNG().nextFloat() * 0.2F)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } } @@ -1806,7 +1806,7 @@ public class ClientProxy extends ServerProxy { .addPos(0, 0, 0, retire)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } else { @@ -1827,7 +1827,7 @@ public class ClientProxy extends ServerProxy { .addPos(2, 0, 2, sideways) .addPos(0, 0, 0, retire)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } } @@ -1839,7 +1839,7 @@ public class ClientProxy extends ServerProxy { BusAnimation anim = item.getAnimation(data, stack); if(anim != null) { - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), anim); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), anim, null); } } } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d5de9f424..c9c6a1eeb 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -212,7 +212,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.cbt_device, 1), new Object[] { STEEL.bolt(), ModItems.wrench }); addShapelessAuto(new ItemStack(ModItems.toothpicks, 3), new Object[] { KEY_STICK, KEY_STICK, KEY_STICK }); - addRecipeAuto(new ItemStack(ModItems.ducttape, 6), new Object[] { "FSF", "SPS", "FSF", 'F', Items.string, 'S', KEY_SLIME, 'P', Items.paper }); + addRecipeAuto(new ItemStack(ModItems.ducttape, 4), new Object[] { "F", "P", "S", 'F', Items.string, 'S', KEY_SLIME, 'P', Items.paper }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_sender, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', NETHERQUARTZ.gem() }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_receiver, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', IRON.ingot() }); @@ -351,14 +351,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.stamp_desh_flat, 1), new Object[] { "BDB", "DSD", "BDB", 'B', brick, 'D', DESH.ingot(), 'S', FERRO.ingot() }); } - addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_1, 1), new Object[] { "ICI", "CAC", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_2, 1), new Object[] { "ATA", "TDT", "ATA", 'A', ALLOY.plate(), 'T', W.ingot(), 'D', DURA.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_rifle_1, 1), new Object[] { "ICI", "MAM", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot(), 'M', ModItems.mechanism_revolver_1 }); - addRecipeAuto(new ItemStack(ModItems.mechanism_rifle_2, 1), new Object[] { "ATA", "MDM", "ATA", 'A', ALLOY.plate(), 'T', W.ingot(), 'D', DURA.ingot(), 'M', ModItems.mechanism_revolver_2 }); - addRecipeAuto(new ItemStack(ModItems.mechanism_launcher_1, 1), new Object[] { "TTT", "SSS", "BBI", 'T', TI.plate(), 'S', STEEL.ingot(), 'B', W.bolt(), 'I', MINGRADE.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_launcher_2, 1), new Object[] { "TTT", "SSS", "BBI", 'T', ALLOY.plate(), 'S', ANY_PLASTIC.ingot(), 'B', W.bolt(), 'I', DESH.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_special, 1), new Object[] { "PCI", "ISS", "PCI", 'P', ModItems.plate_desh, 'C', ModItems.coil_advanced_alloy, 'I', STAR.ingot(), 'S', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModBlocks.watz_pump, 1), new Object[] { "MPM", "PCP", "PSP", 'M', ModItems.motor_desh, 'P', ANY_RESISTANTALLOY.plateCast(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'S', ModItems.pipes_steel }); addRecipeAuto(new ItemStack(ModBlocks.reinforced_stone, 4), new Object[] { "FBF", "BFB", "FBF", 'F', Blocks.cobblestone, 'B', Blocks.stone }); @@ -740,7 +732,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.dfc_emitter, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModBlocks.machine_transformer_dnt, 'X', ModItems.crystal_xen, 'L', ModItems.sat_head_laser }); addRecipeAuto(new ItemStack(ModBlocks.dfc_receiver, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModBlocks.machine_transformer_dnt, 'X', ModBlocks.block_dineutronium, 'L', STEEL.shell() }); addRecipeAuto(new ItemStack(ModBlocks.dfc_injector, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', CMB.plate(), 'T', ModBlocks.machine_fluidtank, 'X', ModItems.motor, 'L', ModItems.pipes_steel }); - addRecipeAuto(new ItemStack(ModBlocks.dfc_stabilizer, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModItems.singularity_spark, 'X', ModItems.magnet_circular, 'L', ModItems.crystal_xen }); + addRecipeAuto(new ItemStack(ModBlocks.dfc_stabilizer, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModItems.singularity_spark, 'X', ModBlocks.fusion_conductor, 'L', ModItems.crystal_xen }); addRecipeAuto(new ItemStack(ModBlocks.barrel_plastic, 1), new Object[] { "IPI", "I I", "IPI", 'I', ModItems.plate_polymer, 'P', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.barrel_iron, 1), new Object[] { "IPI", "I I", "IPI", 'I', IRON.plate(), 'P', IRON.ingot() }); addShapelessAuto(new ItemStack(ModBlocks.barrel_iron, 1), new Object[] { ModBlocks.barrel_corroded, ANY_TAR.any() }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index dd4323118..35e7e03e3 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -131,7 +131,7 @@ public class MainRegistry { public static ToolMaterial enumToolMaterialBatNail = EnumHelper.addToolMaterial("BATNAIL", 0, 450, 1.0F, 4F, 25); public static ToolMaterial enumToolMaterialGolfClub = EnumHelper.addToolMaterial("GOLFCLUB", 1, 1000, 2.0F, 5F, 25); public static ToolMaterial enumToolMaterialPipeRusty = EnumHelper.addToolMaterial("PIPERUSTY", 1, 350, 1.5F, 4.5F, 25); - public static ToolMaterial enumToolMaterialPipeLead = EnumHelper.addToolMaterial("PIPELEAD", 1, 250, 1.5F, 5.5F, 25); + public static ToolMaterial enumToolMaterialPipeLead = EnumHelper.addToolMaterial("PIPELEAD", 1, 250, 1.5F, 3F, 25); public static ToolMaterial enumToolMaterialBottleOpener = EnumHelper.addToolMaterial("OPENER", 1, 250, 1.5F, 0.5F, 200); public static ToolMaterial enumToolMaterialSledge = EnumHelper.addToolMaterial("SHIMMERSLEDGE", 1, 0, 25.0F, 26F, 200); @@ -1665,6 +1665,14 @@ public class MainRegistry { ignoreMappings.add("hbm:item.bobmazon_weapons"); ignoreMappings.add("hbm:item.bobmazon_tools"); ignoreMappings.add("hbm:item.missile_carrier"); + ignoreMappings.add("hbm:item.magnet_circular"); + ignoreMappings.add("hbm:item.mechanism_revolver_1"); + ignoreMappings.add("hbm:item.mechanism_revolver_2"); + ignoreMappings.add("hbm:item.mechanism_rifle_1"); + ignoreMappings.add("hbm:item.mechanism_rifle_2"); + ignoreMappings.add("hbm:item.mechanism_launcher_1"); + ignoreMappings.add("hbm:item.mechanism_launcher_2"); + ignoreMappings.add("hbm:item.mechanism_special"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index bdba621ca..7415566d7 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -370,12 +370,10 @@ public class ModEventHandler { if(rand.nextInt(1024) == 0) entity.setCurrentItemOrArmor(3, new ItemStack(ModItems.starmetal_plate, 1, world.rand.nextInt(ModItems.starmetal_plate.getMaxDamage()))); - if(rand.nextInt(128) == 0) + if(rand.nextInt(64) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.pipe_lead, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.reer_graar, 1, world.rand.nextInt(100))); - if(rand.nextInt(128) == 0) - entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.pipe_rusty, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.crowbar, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 12d7101c7..a7f6b916b 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -38,6 +38,8 @@ public class NEIRegistry { handlers.add(new FusionRecipeHandler()); handlers.add(new SILEXRecipeHandler()); handlers.add(new FuelPoolHandler()); + handlers.add(new RBMKRodDisassemblyHandler()); + handlers.add(new RBMKWasteDecayHandler()); handlers.add(new CrucibleSmeltingHandler()); handlers.add(new CrucibleAlloyingHandler()); handlers.add(new CrucibleCastingHandler()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 1f3c3dd08..1b5e83629 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -349,6 +349,9 @@ public class ResourceManager { public static IModelCustomNamed silo_hatch_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj")).asVBO(); + //Skeleton + public static final IModelCustom skeleton_holder = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/blocks/skeleton_holder.obj"),false).asVBO(); + //Lights public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj")); public static final IModelCustom cage_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/cage_lamp.obj")); @@ -760,6 +763,9 @@ public class ResourceManager { public static final ResourceLocation transition_seal_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/transition_seal.png"); public static final ResourceLocation fire_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/fire_door.png"); + //Skeleton + public static final ResourceLocation skeleton_holder_tex = new ResourceLocation(RefStrings.MODID, "textures/particle/skeleton.png"); + //Lantern public static final ResourceLocation lantern_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/lantern.png"); public static final ResourceLocation lantern_rusty_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/lantern_rusty.png"); @@ -897,6 +903,7 @@ public class ResourceManager { public static final IModelCustom armor_tail = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/tail_peep.obj")); public static final IModelCustom player_manly_af = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/armor/player_fem.obj")); public static final IModelCustom armor_envsuit = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/envsuit.obj")); + public static final IModelCustom armor_taurun = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/taurun.obj")); public static final IModelCustom armor_trenchmaster = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/trenchmaster.obj")); ////Texture Items @@ -958,6 +965,7 @@ public class ResourceManager { public static final ResourceLocation flamethrower_daybreaker_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/flamethrower_daybreaker.png"); public static final ResourceLocation mike_hawk_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lag.png"); public static final ResourceLocation uzi_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi.png"); + public static final ResourceLocation uzi_saturnite_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi_saturnite.png"); public static final ResourceLocation panzerschreck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/panzerschreck.png"); public static final ResourceLocation g3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3.png"); public static final ResourceLocation g3_green_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_polymer_green.png"); @@ -1047,6 +1055,10 @@ public class ResourceManager { public static final ResourceLocation rpa_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/rpa_chest.png"); public static final ResourceLocation rpa_arm = new ResourceLocation(RefStrings.MODID, "textures/armor/rpa_arm.png"); + public static final ResourceLocation taurun_helmet = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_helmet.png"); + public static final ResourceLocation taurun_leg = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_leg.png"); + public static final ResourceLocation taurun_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_chest.png"); + public static final ResourceLocation taurun_arm = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_arm.png"); public static final ResourceLocation trenchmaster_helmet = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_helmet.png"); public static final ResourceLocation trenchmaster_leg = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_leg.png"); public static final ResourceLocation trenchmaster_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_chest.png"); diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index eca4c4853..8387ce48c 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -56,10 +56,13 @@ public class StructureManager { public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); + public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); + public static final NBTStructure oil_rig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oil_rig.nbt")); + public static final NBTStructure beached_patrol = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/beached_patrol.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); // public static final NBTStructure test_jigsaw_hall = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-hall.nbt")); -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java index 922d19200..f72fddb63 100644 --- a/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java +++ b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java @@ -105,7 +105,7 @@ public class GunAnimationPacket implements IMessage { if(animation != null) { boolean isReloadAnimation = type == AnimType.RELOAD || type == AnimType.RELOAD_CYCLE || type == AnimType.RELOAD_EMPTY; - HbmAnimations.hotbar[slot][0] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, isReloadAnimation && base.mainConfig.reloadAnimationsSequential); + HbmAnimations.hotbar[slot][0] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, type, isReloadAnimation && base.mainConfig.reloadAnimationsSequential); } } catch(Exception x) { } @@ -143,7 +143,7 @@ public class GunAnimationPacket implements IMessage { Minecraft.getMinecraft().entityRenderer.itemRenderer.resetEquippedProgress(); Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender = stack; boolean isReloadAnimation = type == AnimType.RELOAD || type == AnimType.RELOAD_CYCLE || type == AnimType.RELOAD_EMPTY; - HbmAnimations.hotbar[slot][gunIndex] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, isReloadAnimation && config.getReloadAnimSequential(stack)); + HbmAnimations.hotbar[slot][gunIndex] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, type, isReloadAnimation && config.getReloadAnimSequential(stack)); } } } diff --git a/src/main/java/com/hbm/render/anim/HbmAnimations.java b/src/main/java/com/hbm/render/anim/HbmAnimations.java index e5cc8becd..218042e44 100644 --- a/src/main/java/com/hbm/render/anim/HbmAnimations.java +++ b/src/main/java/com/hbm/render/anim/HbmAnimations.java @@ -47,18 +47,22 @@ public class HbmAnimations { public BusAnimation animation; // If set, don't cancel this animation when the timer ends, instead wait for the next to start public boolean holdLastFrame = false; + // so we know what type of animation we're playing, only used rarely + public AnimType type; - public Animation(String key, long startMillis, BusAnimation animation) { + public Animation(String key, long startMillis, BusAnimation animation, AnimType type) { this.key = key; this.startMillis = startMillis; this.animation = animation; + this.type = type; } - public Animation(String key, long startMillis, BusAnimation animation, boolean holdLastFrame) { + public Animation(String key, long startMillis, BusAnimation animation, AnimType type, boolean holdLastFrame) { this.key = key; this.startMillis = startMillis; this.animation = animation; this.holdLastFrame = holdLastFrame; + this.type = type; } } diff --git a/src/main/java/com/hbm/render/entity/mob/RenderGhost.java b/src/main/java/com/hbm/render/entity/mob/RenderGhost.java index 98c1484a9..812107d0c 100644 --- a/src/main/java/com/hbm/render/entity/mob/RenderGhost.java +++ b/src/main/java/com/hbm/render/entity/mob/RenderGhost.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.entity.mob.EntityGhost; import com.hbm.lib.RefStrings; -import com.hbm.render.model.ModelSiegeZombie; +import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.RenderBiped; import net.minecraft.entity.Entity; @@ -15,7 +15,7 @@ import net.minecraft.util.ResourceLocation; public class RenderGhost extends RenderBiped { public RenderGhost() { - super(new ModelSiegeZombie(0.0F), 0.5F, 1.0F); + super(new ModelBiped(0.0F), 0.5F, 1.0F); } @Override diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java deleted file mode 100644 index 932e739ec..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hbm.render.entity.mob; - -import com.hbm.entity.mob.siege.EntitySiegeSkeleton; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; - -import net.minecraft.client.model.ModelSkeleton; -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeSkeleton extends RenderBiped { - - public RenderSiegeSkeleton() { - super(new ModelSkeleton() { - - @Override - public void setLivingAnimations(EntityLivingBase entity, float f0, float f1, float f2) { - this.aimedBow = true; - } - }, 0.5F); - } - - @Override - protected ResourceLocation getEntityTexture(EntityLiving entity) { - return this.getEntityTexture((EntitySiegeSkeleton) entity); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeSkeleton) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeSkeleton entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/siege_" + tier.name + ".png"); - } -} diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java deleted file mode 100644 index ad9ad0793..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.render.entity.mob; - -import org.lwjgl.opengl.GL11; - -import com.hbm.entity.mob.siege.EntitySiegeUFO; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; -import com.hbm.main.ResourceManager; - -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeUFO extends Render { - - @Override - public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { - - GL11.glPushMatrix(); - GL11.glTranslated(x, y + 0.25, z); - - EntitySiegeUFO ufo = (EntitySiegeUFO) entity; - - this.bindTexture(getEntityTexture(entity)); - - double rot = (entity.ticksExisted + f1) * 5 % 360D; - GL11.glRotated(rot, 0, 1, 0); - - - if(!ufo.isEntityAlive()) { - float tilt = ufo.deathTime + f1; - GL11.glRotatef(tilt * 5, 1, 0, 1); - } else if(entity.hurtResistantTime > 0) { - GL11.glRotated(Math.sin(System.currentTimeMillis() * 0.01D) * (entity.hurtResistantTime - f1), 1, 0, 0); - } - - GL11.glShadeModel(GL11.GL_SMOOTH); - GL11.glDisable(GL11.GL_CULL_FACE); - ResourceManager.mini_ufo.renderAll(); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_FLAT); - - GL11.glPopMatrix(); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeUFO) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeUFO entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/ufo_siege_" + tier.name + ".png"); - } -} diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java deleted file mode 100644 index 679d0a9d7..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hbm.render.entity.mob; - -import com.hbm.entity.mob.siege.EntitySiegeZombie; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; -import com.hbm.render.model.ModelSiegeZombie; - -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeZombie extends RenderBiped { - - public RenderSiegeZombie() { - super(new ModelSiegeZombie(0.0F), 0.5F, 1.0F); - } - - @Override - protected ResourceLocation getEntityTexture(EntityLiving entity) { - return this.getEntityTexture((EntitySiegeZombie) entity); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeZombie) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeZombie entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/siege_" + tier.name + ".png"); - } - - @Override - protected void func_82421_b() { - this.field_82423_g = new ModelSiegeZombie(1.0F); //armor slots 1, 2, 4 - this.field_82425_h = new ModelSiegeZombie(0.5F); //armor slot 3 - } -} diff --git a/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java b/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java new file mode 100644 index 000000000..7f43d82bc --- /dev/null +++ b/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.mob; + +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.render.model.ModelSkeletonNT; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelZombie; +import net.minecraft.client.renderer.entity.RenderBiped; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; + +public class RenderUndeadSoldier extends RenderBiped { + + public static ResourceLocation textureZombie = new ResourceLocation("textures/entity/zombie/zombie.png"); + public static ResourceLocation textureSkeleton = new ResourceLocation("textures/entity/skeleton/skeleton.png"); + + public static ModelBiped modelZombie = new ModelZombie(); + public static ModelBiped modelSkeleton = new ModelSkeletonNT(); + + public RenderUndeadSoldier() { + super(modelZombie, 0.5F); + } + + @Override + protected void preRenderCallback(EntityLivingBase living, float interp) { + byte type = living.getDataWatcher().getWatchableObjectByte(EntityUndeadSoldier.DW_TYPE); + if(type == EntityUndeadSoldier.TYPE_ZOMBIE) this.mainModel = this.modelBipedMain = modelZombie; + if(type == EntityUndeadSoldier.TYPE_SKELETON) this.mainModel = this.modelBipedMain = modelSkeleton; + } + + @Override + protected ResourceLocation getEntityTexture(EntityLiving living) { + byte type = living.getDataWatcher().getWatchableObjectByte(EntityUndeadSoldier.DW_TYPE); + if(type == EntityUndeadSoldier.TYPE_ZOMBIE) return textureZombie; + if(type == EntityUndeadSoldier.TYPE_SKELETON) return textureSkeleton; + return null; + } +} diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java index b43620e10..7d2a59a56 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java @@ -187,7 +187,7 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { ResourceManager.mas36.renderPart("Stock"); ResourceManager.mas36.renderPart("Bolt"); if(isScoped(stack)) ResourceManager.mas36.renderPart("Scope"); - GL11.glTranslated(0, -1, -6); + if(type != ItemRenderType.EQUIPPED) GL11.glTranslated(0, -1, -6); if(hasBayonet(stack)) ResourceManager.mas36.renderPart("Bayonet"); GL11.glShadeModel(GL11.GL_FLAT); } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java index 4752e9443..1fdea82b0 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java @@ -35,7 +35,7 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { public void renderFirstPerson(ItemStack stack) { ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); double scale = 0.25D; GL11.glScaled(scale, scale, scale); @@ -143,7 +143,7 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -159,14 +159,14 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { boolean silenced = hasSilencer(stack, 0); - if(silenced) { + if(silenced && type == ItemRenderType.INVENTORY) { double scale = 0.625D; GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -179,4 +179,8 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { public boolean hasSilencer(ItemStack stack, int cfg) { return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); } + + public boolean isSaturnite(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_UZI_SATURN); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java index 68ab84b23..ec538663b 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java @@ -36,10 +36,10 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { float offset = 0.8F; for(int i = -1; i <= 1; i += 2) { - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + int index = i == -1 ? 0 : 1; + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, index) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); GL11.glPushMatrix(); - int index = i == -1 ? 0 : 1; standardAimingTransform(stack, -2.25F * offset * i, -1.5F * offset, 2.5F * offset, 0, -4.375 / 8D, 1); double scale = 0.25D; @@ -156,7 +156,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderEquipped(ItemStack stack) { GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 1) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -170,7 +170,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderEquippedAkimbo(ItemStack stack) { GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 0) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("GunMirror"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -185,7 +185,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, index) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart(index == 0 ? "GunMirror" : "Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -199,7 +199,6 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderOther(ItemStack stack, ItemRenderType type) { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); boolean silencer0 = hasSilencer(stack, 1); boolean silencer1 = hasSilencer(stack, 0); @@ -216,6 +215,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 1) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -238,6 +238,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 0) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("GunMirror"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -252,4 +253,8 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public boolean hasSilencer(ItemStack stack, int cfg) { return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); } + + public boolean isSaturnite(ItemStack stack, int cfg) { + return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_UZI_SATURN); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index 634f50e4a..e365bf670 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -84,6 +84,16 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { GL11.glPushMatrix(); if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) { + /*ItemRenderer ir = mc.entityRenderer.itemRenderer; + float equip = ir.prevEquippedProgress + (ir.equippedProgress- ir.prevEquippedProgress) * interp; + Animation current = HbmAnimations.getRelevantAnim(); + // flicker prevention, if equip is in progress, only render if an animation is playing + if(!(equip < 0.25 && ir.prevEquippedProgress < ir.equippedProgress && (current == null || current.type != AnimType.EQUIP))) { + entityRenderer.enableLightmap(interp); + this.setupTransformsAndRender(stack); + entityRenderer.disableLightmap(interp); + }*/ + entityRenderer.enableLightmap(interp); this.setupTransformsAndRender(stack); entityRenderer.disableLightmap(interp); diff --git a/src/main/java/com/hbm/render/model/ModelArmorBase.java b/src/main/java/com/hbm/render/model/ModelArmorBase.java index 99085fa94..be561bcaa 100644 --- a/src/main/java/com/hbm/render/model/ModelArmorBase.java +++ b/src/main/java/com/hbm/render/model/ModelArmorBase.java @@ -5,6 +5,7 @@ import com.hbm.render.loader.ModelRendererObj; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.entity.RenderBiped; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.Entity; @@ -174,6 +175,13 @@ public class ModelArmorBase extends ModelBiped { leftArm.copyRotationFrom(render.modelBipedMain.bipedLeftArm); rightArm.copyRotationFrom(render.modelBipedMain.bipedRightArm); } + } else { + Object o = RenderManager.instance.entityRenderMap.get(entity.getClass()); + if(o instanceof RenderBiped) { + RenderBiped render = (RenderBiped) o; + leftArm.copyRotationFrom(render.modelBipedMain.bipedLeftArm); + rightArm.copyRotationFrom(render.modelBipedMain.bipedRightArm); + } } } diff --git a/src/main/java/com/hbm/render/model/ModelArmorTaurun.java b/src/main/java/com/hbm/render/model/ModelArmorTaurun.java new file mode 100644 index 000000000..282be3f7b --- /dev/null +++ b/src/main/java/com/hbm/render/model/ModelArmorTaurun.java @@ -0,0 +1,60 @@ +package com.hbm.render.model; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; +import com.hbm.render.loader.ModelRendererObj; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; + +public class ModelArmorTaurun extends ModelArmorBase { + + public ModelArmorTaurun(int type) { + super(type); + + head = new ModelRendererObj(ResourceManager.armor_taurun, "Helmet"); + body = new ModelRendererObj(ResourceManager.armor_taurun, "Chest"); + leftArm = new ModelRendererObj(ResourceManager.armor_taurun, "LeftArm").setRotationPoint(-5.0F, 2.0F, 0.0F); + rightArm = new ModelRendererObj(ResourceManager.armor_taurun, "RightArm").setRotationPoint(5.0F, 2.0F, 0.0F); + leftLeg = new ModelRendererObj(ResourceManager.armor_taurun, "LeftLeg").setRotationPoint(1.9F, 12.0F, 0.0F); + rightLeg = new ModelRendererObj(ResourceManager.armor_taurun, "RightLeg").setRotationPoint(-1.9F, 12.0F, 0.0F); + leftFoot = new ModelRendererObj(ResourceManager.armor_taurun, "LeftBoot").setRotationPoint(1.9F, 12.0F, 0.0F); + rightFoot = new ModelRendererObj(ResourceManager.armor_taurun, "RightBoot").setRotationPoint(-1.9F, 12.0F, 0.0F); + } + + @Override + public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { + setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); + + GL11.glPushMatrix(); + + if(type == 0) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_helmet); + head.render(par7); + } + if(type == 1) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_chest); + body.render(par7); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_arm); + leftArm.render(par7); + rightArm.render(par7); + } + if(type == 2) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_leg); + GL11.glTranslated(-0.01, 0, 0); + leftLeg.render(par7); + GL11.glTranslated(0.02, 0, 0); + rightLeg.render(par7); + } + if(type == 3) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_leg); + GL11.glTranslated(-0.01, 0, 0); + leftFoot.render(par7); + GL11.glTranslated(0.02, 0, 0); + rightFoot.render(par7); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java b/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java index 533190861..16fc1aa88 100644 --- a/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java +++ b/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java @@ -62,12 +62,16 @@ public class ModelArmorTrenchmaster extends ModelArmorBase { } if(type == 2) { Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.trenchmaster_leg); + GL11.glTranslated(-0.01, 0, 0); leftLeg.render(par7); + GL11.glTranslated(0.02, 0, 0); rightLeg.render(par7); } if(type == 3) { Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.trenchmaster_leg); + GL11.glTranslated(-0.01, 0, 0); leftFoot.render(par7); + GL11.glTranslated(0.02, 0, 0); rightFoot.render(par7); } diff --git a/src/main/java/com/hbm/render/model/ModelSiegeZombie.java b/src/main/java/com/hbm/render/model/ModelSiegeZombie.java deleted file mode 100644 index 76bd7c883..000000000 --- a/src/main/java/com/hbm/render/model/ModelSiegeZombie.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.hbm.render.model; - -import com.hbm.entity.mob.siege.EntitySiegeZombie; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelSiegeZombie extends ModelBiped { - - public ModelSiegeZombie(float p_i1168_1_) { - super(p_i1168_1_, 0.0F, 64, 32); - } - - public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_, float p_78087_5_, float p_78087_6_, Entity entity) { - super.setRotationAngles(p_78087_1_, p_78087_2_, p_78087_3_, p_78087_4_, p_78087_5_, p_78087_6_, entity); - - if(entity instanceof EntitySiegeZombie && ((EntitySiegeZombie)entity).getDataWatcher().getWatchableObjectByte(13) != 0) { - float f6 = MathHelper.sin(this.onGround * (float) Math.PI); - float f7 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float) Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float) Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float) Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; - } - } -} diff --git a/src/main/java/com/hbm/render/model/ModelSkeletonNT.java b/src/main/java/com/hbm/render/model/ModelSkeletonNT.java new file mode 100644 index 000000000..987519f54 --- /dev/null +++ b/src/main/java/com/hbm/render/model/ModelSkeletonNT.java @@ -0,0 +1,29 @@ +package com.hbm.render.model; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.model.ModelZombie; + +public class ModelSkeletonNT extends ModelZombie { + + public ModelSkeletonNT() { + this(0.0F); + } + + public ModelSkeletonNT(float scale) { + super(scale, 0.0F, 64, 32); + this.bipedRightArm = new ModelRenderer(this, 40, 16); + this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, scale); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); + this.bipedLeftArm = new ModelRenderer(this, 40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, scale); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, scale); + this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, scale); + this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java b/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java index 6f39d7389..76c606e18 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java @@ -37,10 +37,6 @@ public class RenderPedestalTile extends TileEntitySpecialRenderer { if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { GL11.glTranslated(0, 0.125, 0); GL11.glRotatef(player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * interp + 180, 0.0F, -1.0F, 0.0F); - - if(!RenderManager.instance.options.fancyGraphics) { - GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); - } GL11.glTranslated(0, Math.sin((player.ticksExisted + interp) * 0.1) * 0.0625, 0); } else { diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java new file mode 100644 index 000000000..c40bf33c4 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -0,0 +1,72 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.main.ResourceManager; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +public class RenderSkeletonHolder extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + + switch(te.getBlockMetadata()) { + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + } + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.enableStandardItemLighting(); + + bindTexture(ResourceManager.skeleton_holder_tex); + ResourceManager.skeleton_holder.renderPart("Holder1"); + + TileEntitySkeletonHolder pedestal = (TileEntitySkeletonHolder) te; + + if(pedestal.item != null) { + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack stack = pedestal.item.copy(); + + GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); + + if(stack.getItem() instanceof ItemGunBaseNT) { + GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F); + } + + if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { + GL11.glScaled(1.5, 1.5, 1.5); + } + + GL11.glTranslated(0, 0.125, 0); + + EntityItem dummy = new EntityItem(te.getWorldObj(), 0, 0, 0, stack); + dummy.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index d383cdd29..16b57c2ec 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -14,6 +14,7 @@ import com.hbm.blocks.generic.BlockGlyphidSpawner.TileEntityGlpyhidSpawner; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; @@ -212,6 +213,7 @@ public class TileMappings { put(TileEntityLoot.class, "tileentity_ntm_loot"); put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); + put(TileEntitySkeletonHolder.class, "tileentity_ntm_skeleton"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); put(TileEntitySnowglobe.class, "tileentity_ntm_snowglobe"); put(TileEntityPlushie.class, "tileentity_ntm_plushie"); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 88b69a4c1..a383f491a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -1,7 +1,11 @@ package com.hbm.tileentity.machine.storage; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; +import api.hbm.fluidmk2.FluidNode; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import java.util.HashSet; + import com.hbm.blocks.ModBlocks; import com.hbm.handler.CompatHandler; import com.hbm.inventory.FluidContainerRegistry; @@ -19,6 +23,8 @@ import com.hbm.tileentity.IFluidCopiable; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.uninos.UniNodespace; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -36,10 +42,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { + protected FluidNode node; + protected FluidType lastType; + public FluidTank tank; public short mode = 0; public static final short modes = 4; @@ -89,10 +99,46 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.setType(0, 1, slots); tank.loadTank(2, 3, slots); tank.unloadTank(4, 5, slots); - - for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 2) this.trySubscribe(tank.getTankType(), worldObj, pos); - if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); + + // In buffer mode, acts like a pipe block, providing fluid to its own node + // otherwise, it is a regular providing/receiving machine, blocking further propagation + if(mode == 1) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); + } + } + + if(node != null && node.hasValidNet()) { + node.net.addProvider(this); + node.net.addReceiver(this); + } + } else { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; + } + + for(DirPos pos : getConPos()) { + FluidNode dirNode = (FluidNode) UniNodespace.getNode(worldObj, pos.getX(), pos.getY(), pos.getZ(), tank.getTankType().getNetworkProvider()); + + if(mode == 2) { + tryProvide(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == 0) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } + } } if(tank.getFill() > 0) { @@ -103,6 +149,30 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom } } + protected FluidNode createNode(FluidType type) { + DirPos[] conPos = getConPos(); + + HashSet posSet = new HashSet<>(); + posSet.add(new BlockPos(this)); + for(DirPos pos : conPos) { + ForgeDirection dir = pos.getDir(); + posSet.add(new BlockPos(pos.getX() - dir.offsetX, pos.getY() - dir.offsetY, pos.getZ() - dir.offsetZ)); + } + + return new FluidNode(type.getNetworkProvider(), posSet.toArray(new BlockPos[posSet.size()])).setConnections(conPos); + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + } + } + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -219,6 +289,8 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.writeToNBT(nbt, "tank"); } + @Override public boolean canConnect(FluidType fluid, ForgeDirection dir) { return true; } + @Override public FluidTank[] getSendingTanks() { return (mode == 1 || mode == 2) ? new FluidTank[] {tank} : new FluidTank[0]; @@ -234,6 +306,11 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom return new FluidTank[] { tank }; } + @Override + public ConnectionPriority getFluidPriority() { + return mode == 1 ? ConnectionPriority.LOW : ConnectionPriority.NORMAL; + } + @Override public int[] getFluidIDToCopy() { return new int[] {tank.getTankType().getID()}; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java index 896112e17..1dac5081a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java @@ -191,7 +191,7 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme /// For when opening from a player's inventory. public static void spawnSpiders(EntityPlayer player, World worldObj, ItemStack crate) { - if(crate.getTagCompound().getBoolean("spiders")) { + if(crate.hasTagCompound() && crate.getTagCompound().getBoolean("spiders")) { Random random = new Random(); for (int i = 0; i < numSpiders; i++) { diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 543e7205f..8b038ff38 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -16,6 +16,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.uninos.UniNodespace; import com.hbm.util.CompatEnergyControl; import cpw.mods.fml.common.Optional; @@ -36,14 +37,14 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyConductorMK2, IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, SimpleComponent, IGUIProvider, IInfoProviderEC, CompatHandler.OCComponent { - + public long[] log = new long[20]; public long delta = 0; public long power = 0; public long prevPowerState = 0; - + protected PowerNode node; - + //0: input only //1: buffer //2: output only @@ -55,16 +56,16 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public short redLow = 0; public short redHigh = 2; public ConnectionPriority priority = ConnectionPriority.LOW; - + //public boolean conducts = false; public byte lastRedstone = 0; - + private static final int[] slots_top = new int[] {0}; private static final int[] slots_bottom = new int[] {0, 1}; private static final int[] slots_side = new int[] {1}; - + private String customName; - + public TileEntityMachineBattery() { super(2); slots = new ItemStack[2]; @@ -84,24 +85,24 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + switch(i) { case 0: case 1: if(stack.getItem() instanceof IBatteryItem) return true; break; } - + return true; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -112,18 +113,18 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I this.lastRedstone = nbt.getByte("lastRedstone"); this.priority = ConnectionPriority.values()[nbt.getByte("priority")]; } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setShort("redLow", redLow); nbt.setShort("redHigh", redHigh); nbt.setByte("lastRedstone", lastRedstone); nbt.setByte("priority", (byte)this.priority.ordinal()); } - + @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); @@ -136,7 +137,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { - + if(itemStack.getItem() instanceof IBatteryItem) { if(i == 0 && ((IBatteryItem)itemStack.getItem()).getCharge(itemStack) == 0) { return true; @@ -145,79 +146,95 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I return true; } } - + return false; } public long getPowerRemainingScaled(long i) { return (power * i) / this.getMaxPower(); } - + public byte getComparatorPower() { if(power == 0) return 0; double frac = (double) this.power / (double) this.getMaxPower() * 15D; return (byte) (MathHelper.clamp_int((int) frac + 1, 0, 15)); //to combat eventual rounding errors with the FEnSU's stupid maxPower } - + @Override public void updateEntity() { - + if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { - + if(priority == null || priority.ordinal() == 0 || priority.ordinal() == 4) { priority = ConnectionPriority.LOW; } - + int mode = this.getRelevantMode(false); - - if(this.node == null || this.node.expired) { - - this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); - + + long prevPower = this.power; + + power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); + + // In buffer mode, becomes a cable block and provides power to itself + // otherwise, acts like a regular power providing/accepting machine + if(mode == mode_buffer) { if(this.node == null || this.node.expired) { - this.node = this.createNode(); - Nodespace.createNode(worldObj, this.node); + + this.node = (PowerNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + UniNodespace.createNode(worldObj, this.node); + } + } + + this.tryProvide(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + this.node = null; + } + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + PowerNode dirNode = (PowerNode) UniNodespace.getNode(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, Nodespace.THE_POWER_PROVIDER); + + if(mode == mode_output) { + tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == mode_input) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } } } - - long prevPower = this.power; - - power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - - if(mode == mode_output || mode == mode_buffer) { - this.tryProvide(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - } else { - if(node != null && node.hasValidNet()) node.net.removeProvider(this); - } - + byte comp = this.getComparatorPower(); if(comp != this.lastRedstone) this.markDirty(); this.lastRedstone = comp; - - if(mode == mode_input || mode == mode_buffer) { - if(node != null && node.hasValidNet()) node.net.addReceiver(this); - } else { - if(node != null && node.hasValidNet()) node.net.removeReceiver(this); - } - + power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); long avg = (power + prevPower) / 2; this.delta = avg - this.log[0]; - + for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } - + this.log[19] = avg; - + prevPowerState = power; - + this.networkPackNT(20); } } - + public void onNodeDestroyedCallback() { this.node = null; } @@ -225,10 +242,10 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public void invalidate() { super.invalidate(); - + if(!worldObj.isRemote) { if(this.node != null) { - Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); } } } @@ -237,7 +254,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I int mode = this.getRelevantMode(true); return mode == mode_output || mode == mode_buffer ? this.getMaxPower() / 600 : 0; } - + @Override public long getReceiverSpeed() { int mode = this.getRelevantMode(true); return mode == mode_input || mode == mode_buffer ? this.getMaxPower() / 200 : 0; @@ -269,30 +286,30 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public long getPower() { return power; } - + private short modeCache = 0; public short getRelevantMode(boolean useCache) { if(useCache) return this.modeCache; this.modeCache = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) ? this.redHigh : this.redLow; return this.modeCache; } - + private long bufferedMax; @Override public long getMaxPower() { - + if(bufferedMax == 0) { bufferedMax = ((MachineBattery)worldObj.getBlock(xCoord, yCoord, zCoord)).maxPower; } - + return bufferedMax; } @Override public boolean canConnect(ForgeDirection dir) { return true; } @Override public void setPower(long power) { this.power = power; } @Override public ConnectionPriority getPriority() { return this.priority; } - + // do some opencomputer stuff @Override @Optional.Method(modid = "OpenComputers") diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index 891343625..cf6e8dccc 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -1,6 +1,9 @@ package com.hbm.tileentity.machine.storage; -import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; +import api.hbm.fluidmk2.FluidNode; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; + import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.explosion.vanillant.ExplosionVNT; @@ -21,8 +24,10 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.*; +import com.hbm.uninos.UniNodespace; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -44,23 +49,26 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Random; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiver, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable{ - +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { + + protected FluidNode node; + protected FluidType lastType; + public FluidTank tank; public short mode = 0; public static final short modes = 4; public boolean hasExploded = false; - protected boolean sendingBrake = false; public boolean onFire = false; public byte lastRedstone = 0; public Explosion lastExplosion = null; - + public int age = 0; - + public TileEntityMachineFluidTank() { super(6); tank = new FluidTank(Fluids.NONE, 256000); @@ -81,7 +89,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - + //meta below 12 means that it's an old multiblock configuration if(this.getBlockMetadata() < 12) { //get old direction @@ -97,24 +105,61 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements worldObj.getTileEntity(xCoord, yCoord, zCoord).readFromNBT(data); return; } - + if(!hasExploded) { age++; - + if(age >= 20) { age = 0; this.markChanged(); } - - for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 2) this.trySubscribe(tank.getTankType(), worldObj, pos); - if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); + + // In buffer mode, acts like a pipe block, providing fluid to its own node + // otherwise, it is a regular providing/receiving machine, blocking further propagation + if(mode == 1) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); + } + } + + if(node != null && node.hasValidNet()) { + node.net.addProvider(this); + node.net.addReceiver(this); + } + } else { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; + } + + for(DirPos pos : getConPos()) { + FluidNode dirNode = (FluidNode) UniNodespace.getNode(worldObj, pos.getX(), pos.getY(), pos.getZ(), tank.getTankType().getNetworkProvider()); + + if(mode == 2) { + tryProvide(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == 0) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } + } } - + tank.loadTank(2, 3, slots); tank.setType(0, 1, slots); - } else { - for(DirPos pos : getConPos()) this.tryUnsubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ()); + } else if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; } byte comp = this.getComparatorPower(); //comparator shit @@ -130,11 +175,11 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.explode(); this.tank.setFill(0); } - + if(tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).isHighlyCorrosive()) { this.explode(); } - + if(this.hasExploded) { int leaking = 0; @@ -145,26 +190,50 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements } else { leaking = Math.min(tank.getFill(), tank.getMaxFill() / 10000); } - + updateLeak(leaking); } } - + tank.unloadTank(4, 5, slots); - + this.networkPackNT(150); } - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 2.875, zCoord + 1).offset(dir.offsetX * 0.5 - rot.offsetX * 2.25, 0, dir.offsetZ * 0.5 - rot.offsetZ * 2.25)); - + for(EntityPlayer player : players) { HbmPlayerProps props = HbmPlayerProps.getData(player); props.isOnLadder = true; } } + protected FluidNode createNode(FluidType type) { + DirPos[] conPos = getConPos(); + + HashSet posSet = new HashSet<>(); + posSet.add(new BlockPos(this)); + for(DirPos pos : conPos) { + ForgeDirection dir = pos.getDir(); + posSet.add(new BlockPos(pos.getX() - dir.offsetX, pos.getY() - dir.offsetY, pos.getZ() - dir.offsetZ)); + } + + return new FluidNode(type.getNetworkProvider(), posSet.toArray(new BlockPos[posSet.size()])).setConnections(conPos); + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + } + } + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -172,7 +241,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements buf.writeBoolean(hasExploded); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -180,39 +249,39 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements hasExploded = buf.readBoolean(); tank.deserialize(buf); } - + /** called when the tank breaks due to hazardous materials or external force, can be used to quickly void part of the tank or spawn a mushroom cloud */ public void explode() { this.hasExploded = true; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.markChanged(); } - + /** called every tick post explosion, used for leaking fluid and spawning particles */ public void updateLeak(int amount) { if(!hasExploded) return; if(amount <= 0) return; - + this.tank.getTankType().onFluidRelease(this, tank, amount); this.tank.setFill(Math.max(0, this.tank.getFill() - amount)); - + FluidType type = tank.getTankType(); - + if(type.hasTrait(FT_Amat.class)) { new ExplosionVNT(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F).makeAmat().setBlockAllocator(null).setBlockProcessor(null).explode(); - + } else if(type.hasTrait(FT_Flammable.class) && onFire) { List affected = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 1.5, yCoord, zCoord - 1.5, xCoord + 2.5, yCoord + 5, zCoord + 2.5)); for(Entity e : affected) e.setFire(5); Random rand = worldObj.rand; ParticleUtil.spawnGasFlame(worldObj, xCoord + rand.nextDouble(), yCoord + 0.5 + rand.nextDouble(), zCoord + rand.nextDouble(), rand.nextGaussian() * 0.2, 0.1, rand.nextGaussian() * 0.2); - + if(worldObj.getTotalWorldTime() % 5 == 0) { FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.BURN, amount * 5); } - + } else if(type.hasTrait(FT_Gaseous.class) || type.hasTrait(FT_Gaseous_ART.class)) { - + if(worldObj.getTotalWorldTime() % 5 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -232,7 +301,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void explode(World world, int x, int y, int z) { - + if(this.hasExploded) return; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.hasExploded = true; @@ -242,7 +311,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void tryExtinguish(World world, int x, int y, int z, EnumExtinguishType type) { if(!this.hasExploded || !this.onFire) return; - + if(type == EnumExtinguishType.WATER) { if(tank.getTankType().hasTrait(FT_Liquid.class)) { // extinguishing oil with water is a terrible idea! worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F, true, true); @@ -252,13 +321,13 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return; } } - + if(type == EnumExtinguishType.FOAM || type == EnumExtinguishType.CO2) { this.onFire = false; this.markChanged(); } } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), @@ -271,17 +340,17 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) }; } - + public void handleButtonPacket(int value, int meta) { mode = (short) ((mode + 1) % modes); this.markChanged(); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -292,30 +361,30 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + mode = nbt.getShort("mode"); tank.readFromNBT(nbt, "tank"); hasExploded = nbt.getBoolean("exploded"); onFire = nbt.getBoolean("onFire"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setShort("mode", mode); tank.writeToNBT(nbt, "tank"); nbt.setBoolean("exploded", hasExploded); @@ -331,12 +400,8 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public long getDemand(FluidType type, int pressure) { - - if(this.mode == 2 || this.mode == 3 || this.sendingBrake) - return 0; - + if(this.mode == 2 || this.mode == 3) return 0; if(tank.getPressure() != pressure) return 0; - return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } @@ -365,6 +430,8 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.onFire = data.getBoolean("onFire"); } + @Override public boolean canConnect(FluidType fluid, ForgeDirection dir) { return true; } + @Override public FluidTank[] getSendingTanks() { if(this.hasExploded) return new FluidTank[0]; @@ -373,10 +440,15 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public FluidTank[] getReceivingTanks() { - if(this.hasExploded || this.sendingBrake) return new FluidTank[0]; + if(this.hasExploded) return new FluidTank[0]; return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } + @Override + public ConnectionPriority getFluidPriority() { + return mode == 1 ? ConnectionPriority.LOW : ConnectionPriority.NORMAL; + } + @Override public int[] getFluidIDToCopy() { return new int[] {tank.getTankType().getID()}; @@ -402,14 +474,14 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public boolean isDamaged() { return this.hasExploded; } - + List repair = new ArrayList<>(); @Override public List getRepairMaterials() { - + if(!repair.isEmpty()) return repair; - + repair.add(new OreDictStack(OreDictManager.STEEL.plate(), 6)); return repair; } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java index 823dfdb32..a54caa173 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java @@ -1,26 +1,27 @@ package com.hbm.tileentity.network; -import api.hbm.energymk2.Nodespace; +import com.hbm.uninos.UniNodespace; + import net.minecraft.block.Block; import net.minecraft.world.World; public class TileEntityFluidValve extends TileEntityPipeBaseNT { - + @Override public boolean shouldCreateNode() { return this.getBlockMetadata() == 1; } public void updateState() { - + this.blockMetadata = -1; // delete cache - + if(this.getBlockMetadata() == 0 && this.node != null) { - Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, this.getType().getNetworkProvider()); this.node = null; } } - + @Override public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { return oldBlock != newBlock; diff --git a/src/main/java/com/hbm/util/BobMathUtil.java b/src/main/java/com/hbm/util/BobMathUtil.java index e9da65700..029ba1a7e 100644 --- a/src/main/java/com/hbm/util/BobMathUtil.java +++ b/src/main/java/com/hbm/util/BobMathUtil.java @@ -26,6 +26,16 @@ public class BobMathUtil { for(int num : nums) if(num > largest) largest = num; return largest; } + public static long min(long... nums) { + long smallest = Long.MAX_VALUE; + for(long num : nums) if(num < smallest) smallest = num; + return smallest; + } + public static long max(long... nums) { + long largest = Long.MIN_VALUE; + for(long num : nums) if(num > largest) largest = num; + return largest; + } public static float min(float... nums) { float smallest = Float.MAX_VALUE; for(float num : nums) if(num < smallest) smallest = num; diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index c54bb7a0b..320dcf897 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -111,12 +111,12 @@ public class DamageResistanceHandler { .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 20F, 0.65F) - .addCategory(CATEGORY_FIRE, 10F, 0.75F) + .addCategory(CATEGORY_PROJECTILE, 25F, 0.65F) + .addCategory(CATEGORY_FIRE, 10F, 0.9F) .addCategory(CATEGORY_EXPLOSION, 15F, 0.25F) - .addExact(DamageClass.LASER.name(), 10F, 0.75F) + .addExact(DamageClass.LASER.name(), 25F, 0.75F) .addExact(DamageSource.fall.damageType, 0F, 1F) - .setOther(10F, 0.15F)); + .setOther(15F, 0.3F)); ResistanceStats bj = new ResistanceStats() .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 2.5F, 0.5F) @@ -151,6 +151,12 @@ public class DamageResistanceHandler { registerSet(ModItems.dns_helmet, ModItems.dns_plate, ModItems.dns_legs, ModItems.dns_boots, new ResistanceStats() .addCategory(CATEGORY_EXPLOSION, 100F, 0.99F) .setOther(100F, 1F)); + registerSet(ModItems.taurun_helmet, ModItems.taurun_plate, ModItems.taurun_legs, ModItems.taurun_boots, new ResistanceStats() + .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_FIRE, 1F, 0.25F) + .addCategory(CATEGORY_EXPLOSION, 0F, 0.25F) + .addExact(DamageSource.fall.damageType, 4F, 0.5F) + .setOther(2F, 0.1F)); registerSet(ModItems.trenchmaster_helmet, ModItems.trenchmaster_plate, ModItems.trenchmaster_legs, ModItems.trenchmaster_boots, new ResistanceStats() .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) diff --git a/src/main/java/com/hbm/world/feature/DepthDeposit.java b/src/main/java/com/hbm/world/feature/DepthDeposit.java index f3ac76f35..3a99b6198 100644 --- a/src/main/java/com/hbm/world/feature/DepthDeposit.java +++ b/src/main/java/com/hbm/world/feature/DepthDeposit.java @@ -12,40 +12,40 @@ import net.minecraft.world.World; public class DepthDeposit { public static void generateConditionOverworld(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, Blocks.stone, ModBlocks.stone_depth); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, Blocks.stone, ModBlocks.stone_depth); } public static void generateConditionNether(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, Blocks.netherrack, ModBlocks.stone_depth_nether); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, Blocks.netherrack, ModBlocks.stone_depth_nether); } public static void generateCondition(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance, Block genTarget, Block filler) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, genTarget, filler); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, genTarget, filler); } public static void generate(World world, int x, int y, int z, int size, double fill, Block block, Random rand, Block genTarget, Block filler) { - + for(int i = x - size; i <= x + size; i++) { for(int j = y - size; j <= y + size; j++) { for(int k = z - size; k <= z + size; k++) { - + if(j < 1 || j > 126) continue; - + double len = Vec3.createVectorHelper(x - i, y - j, z - k).lengthVector(); Block target = world.getBlock(i, j, k); - + if(target.isReplaceableOreGen(world, i, j, k, genTarget) || target.isReplaceableOreGen(world, i, j, k, Blocks.bedrock)) { //yes you've heard right, bedrock - + if(len + rand.nextInt(2) < size * fill) { world.setBlock(i, j, k, block); - + } else if(len + rand.nextInt(2) <= size) { world.setBlock(i, j, k, filler); } diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/NBTStructure.java index 6ec619378..e7e03185c 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/NBTStructure.java @@ -16,6 +16,7 @@ import com.hbm.handler.ThreeInts; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; import com.hbm.util.Tuple.Quartet; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.*; @@ -94,7 +95,7 @@ public class NBTStructure { } } - public static void registerStructure(SpawnCondition spawn, int... dimensionIds) { + public static void registerStructure(SpawnCondition spawn, int[] dimensionIds) { for(int dimensionId : dimensionIds) { registerStructure(dimensionId, spawn); } @@ -265,6 +266,10 @@ public class NBTStructure { } palette[i] = new BlockDefinition(blockName, meta); + + if(StructureConfig.debugStructures && palette[i].block == Blocks.air) { + palette[i] = new BlockDefinition(ModBlocks.wand_air, meta); + } } @@ -349,7 +354,7 @@ public class NBTStructure { if(connections.size() > 0) { fromConnections = new ArrayList<>(); - connections.sort((a, b) -> a.selectionPriority - b.selectionPriority); // sort by descending priority, highest first + connections.sort((a, b) -> b.selectionPriority - a.selectionPriority); // sort by descending priority, highest first // Sort out our from connections, splitting into individual lists for each priority level List innerList = null; @@ -439,7 +444,7 @@ public class NBTStructure { int ry = by + y; Block block = transformBlock(state.definition, null, world.rand); - int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + int meta = transformMeta(state.definition, null, coordBaseMode); world.setBlock(rx, ry, rz, block, meta, 2); @@ -496,7 +501,7 @@ public class NBTStructure { int ry = by + oy; Block block = transformBlock(state.definition, piece.blockTable, world.rand); - int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + int meta = transformMeta(state.definition, piece.blockTable, coordBaseMode); world.setBlock(rx, ry, rz, block, meta, 2); @@ -552,10 +557,16 @@ public class NBTStructure { return definition.block; } - private int transformMeta(BlockDefinition definition, int coordBaseMode) { + private int transformMeta(BlockDefinition definition, Map blockTable, int coordBaseMode) { + if(blockTable != null && blockTable.containsKey(definition.block)) { + return blockTable.get(definition.block).getSelectedBlockMetaData(); + } + // Our shit if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); + if(coordBaseMode == 0) return definition.meta; + // Vanilla shit if(definition.block instanceof BlockStairs) return INBTTransformable.transformMetaStairs(definition.meta, coordBaseMode); if(definition.block instanceof BlockRotatedPillar) return INBTTransformable.transformMetaPillar(definition.meta, coordBaseMode); @@ -566,6 +577,7 @@ public class NBTStructure { if(definition.block instanceof BlockLever) return INBTTransformable.transformMetaLever(definition.meta, coordBaseMode); if(definition.block instanceof BlockSign) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); if(definition.block instanceof BlockLadder) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTripWireHook) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); return definition.meta; } @@ -630,6 +642,11 @@ public class NBTStructure { this.meta = meta; } + BlockDefinition(Block block, int meta) { + this.block = block; + this.meta = meta; + } + } public static class SpawnCondition { @@ -670,6 +687,31 @@ public class NBTStructure { return pools.get(name).clone(); } + // Builds all of the pools into neat rows and columns, for editing and debugging! + // Make sure structure debug is enabled, or it will no-op + // Do not use in generation + public void buildAll(World world, int x, int y, int z) { + if(!StructureConfig.debugStructures) return; + + int padding = 5; + int oz = 0; + + for(JigsawPool pool : pools.values()) { + int highestWidth = 0; + int ox = 0; + + for(Pair entry : pool.pieces) { + NBTStructure structure = entry.key.structure; + structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); + + ox += structure.size.x + padding; + highestWidth = Math.max(highestWidth, structure.size.z); + } + + oz += highestWidth + padding; + } + } + } // A set of pieces with weights @@ -790,7 +832,7 @@ public class NBTStructure { boolean heightUpdated = false; - int priority; // placement priority not yet implemented because selection priority is far more useful whatever + int priority; // this is fucking hacky but we need a way to update ALL component bounds once a Y-level is determined private Start parent; @@ -941,6 +983,17 @@ public class NBTStructure { return false; } + protected boolean isInsideIgnoringSelf(LinkedList components, int x, int y, int z) { + for(StructureComponent component : components) { + if(component == this) continue; + if(component.getBoundingBox() == null) continue; + + if(component.getBoundingBox().isVecInside(x, y, z)) return true; + } + + return false; + } + } public static class Start extends StructureStart { @@ -966,7 +1019,15 @@ public class NBTStructure { // Iterate through and build out all the components we intend to spawn while(!queuedComponents.isEmpty()) { - final int i = rand.nextInt(queuedComponents.size()); + queuedComponents.sort((a, b) -> b.priority - a.priority); // sort by placement priority descending + int matchPriority = queuedComponents.get(0).priority; + int max = 1; + while(max < queuedComponents.size()) { + if(queuedComponents.get(max).priority != matchPriority) break; + max++; + } + + final int i = rand.nextInt(max); Component fromComponent = queuedComponents.remove(i); if(fromComponent.piece.structure.fromConnections == null) continue; @@ -1008,9 +1069,14 @@ public class NBTStructure { queuedComponents.add(nextComponent); } else { // If we failed to fit anything in, grab something from the fallback pool, ignoring bounds check + // unless we are perfectly abutting another piece, so grid layouts can work! if(nextPool.fallback != null) { - nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); - addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + BlockPos checkPos = getConnectionTargetPosition(fromComponent, fromConnection); + + if(!fromComponent.isInsideIgnoringSelf(components, checkPos.getX(), checkPos.getY(), checkPos.getZ())) { + nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); + addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + } } } } @@ -1031,12 +1097,25 @@ public class NBTStructure { @SuppressWarnings("unchecked") private void addComponent(Component component, int placementPriority) { + if(component == null) return; components.add(component); component.parent = this; component.priority = placementPriority; } + private BlockPos getConnectionTargetPosition(Component component, JigsawConnection connection) { + // The direction this component is extending towards in ABSOLUTE direction + ForgeDirection extendDir = component.rotateDir(connection.dir); + + // Set the starting point for the next structure to the location of the connector block + int x = component.getXWithOffset(connection.pos.x, connection.pos.z) + extendDir.offsetX; + int y = component.getYWithOffset(connection.pos.y) + extendDir.offsetY; + int z = component.getZWithOffset(connection.pos.x, connection.pos.z) + extendDir.offsetZ; + + return new BlockPos(x, y, z); + } + private Component buildNextComponent(Random rand, SpawnCondition spawn, JigsawPool pool, Component fromComponent, JigsawConnection fromConnection) { JigsawPiece nextPiece = pool.get(rand); if(nextPiece == null) return null; @@ -1046,23 +1125,17 @@ public class NBTStructure { JigsawConnection toConnection = connectionPool.get(rand.nextInt(connectionPool.size())); - // The direction this component is extending towards in ABSOLUTE direction - ForgeDirection extendDir = fromComponent.rotateDir(fromConnection.dir); - // Rotate our incoming piece to plug it in int nextCoordBase = fromComponent.getNextCoordBase(fromConnection, toConnection, rand); - // Set the starting point for the next structure to the location of the connector block - int nextX = fromComponent.getXWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetX; - int nextY = fromComponent.getYWithOffset(fromConnection.pos.y) + extendDir.offsetY; - int nextZ = fromComponent.getZWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetZ; + BlockPos pos = getConnectionTargetPosition(fromComponent, fromConnection); // offset the starting point to the connecting point - nextX -= nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); - nextY -= toConnection.pos.y; - nextZ -= nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int ox = nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int oy = toConnection.pos.y; + int oz = nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); - return new Component(spawn, nextPiece, rand, nextX, nextY, nextZ, nextCoordBase).connectedFrom(toConnection); + return new Component(spawn, nextPiece, rand, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase).connectedFrom(toConnection); } private List getConnectionPool(JigsawPiece nextPiece, JigsawConnection fromConnection) { diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 42ad900e4..cd6480087 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -36,6 +36,9 @@ public class NTMWorldGenerator implements IWorldGenerator { public NTMWorldGenerator() { final List invalidBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); + final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); + final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); @@ -61,6 +64,31 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 3 * 4; }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = oceanBiomes::contains; + structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier, -6); + maxHeight = 42; + spawnWeight = 1; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> biome == BiomeGenBase.deepOcean; + structure = new JigsawPiece("oil_rig", StructureManager.oil_rig, -20); + maxHeight = 12; + minHeight = 11; + spawnWeight = 2; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = beachBiomes::contains; + structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol, -5); + minHeight = 58; + maxHeight = 67; + spawnWeight = 8; + }}); + + NBTStructure.registerNullWeight(0, 2); + Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); }}; @@ -201,4 +229,4 @@ public class NTMWorldGenerator implements IWorldGenerator { nbtGen.generateStructures(world, rand, chunkProvider, chunkX, chunkZ); } -} \ No newline at end of file +} diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 60e1b0364..28454115f 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -40,6 +40,8 @@ public net.minecraft.nbt.NBTTagList * # Mo # ItemRenderer public net.minecraft.client.renderer.ItemRenderer field_78453_b # itemToRender +public net.minecraft.client.renderer.ItemRenderer field_78454_c # equippedProgress +public net.minecraft.client.renderer.ItemRenderer field_78451_d # prevEquippedProgress # AbstractResourcePack public net.minecraft.client.resources.AbstractResourcePack field_110597_b # resourcePackFile diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 8d8a8a260..9d6a1ae4b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2447,6 +2447,7 @@ item.insert_polonium.name=Poloniumeinlage item.insert_steel.name=Schwere Stahleinlage item.insert_xsapi.name=XSAPI-Einlage item.insert_yharonite.name=Yharoniteinlage +item.item_secret.aberrator.name=Aberrator-Teil item.item_secret.canister.name=Komposit SB-26 item.item_secret.controller.name=Proprietäre Steuereinheit item.item_secret.selenium_steel.name=Selen-Stahl @@ -3697,6 +3698,14 @@ item.wd40.name=VT-40 item.weapon_bat.name=Richards Standard item.weapon_bat_nail.name=Das Klischee item.weapon_golf_club.name=Schläger des russischen Mafiosos +item.weapon_mod_caliber.bmg50.name=.50 BMG Konversionskit +item.weapon_mod_caliber.m357.name=.357 Magnum Konversionskit +item.weapon_mod_caliber.m44.name=.44 Magnum Konversionskit +item.weapon_mod_caliber.p22.name=.22 lfB Konversionskit +item.weapon_mod_caliber.p45.name=.45 Konversionskit +item.weapon_mod_caliber.p9.name=9mm Konversionskit +item.weapon_mod_caliber.r556.name=5.56mm Konversionskit +item.weapon_mod_caliber.r762.name=7.62mm Konversionskit item.weapon_mod_generic.bigmt_damage.name=Optimierter Saturnit-Verschluss item.weapon_mod_generic.bigmt_dura.name=Langlebige Saturnit-Teile item.weapon_mod_generic.bronze_damage.name=Optimierter Bronzeverschluss @@ -3723,10 +3732,21 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernisierungskit item.weapon_mod_special.saw.name=Bügelsäge item.weapon_mod_special.scope.name=Ziehlvorrichtung item.weapon_mod_special.silencer.name=Schalldämpfer +item.weapon_mod_special.skin_saturnite.name=Saturnit-Skin item.weapon_mod_special.slowdown.name=Rädergetriebe item.weapon_mod_special.speedloader.name=Schnelllader item.weapon_mod_special.speedup.name=Elektrischer Servomotor item.weapon_mod_special.stack_mag.name=Zweistapel-Magazin +item.weapon_mod_test.damage.name=DAMAGE UPGRADE +item.weapon_mod_test.firerate.name=FIRE RATE UPGRADE +item.weapon_mod_test.multi.name=MULTI SHOT UPGRADE +item.weapon_mod_test.override_2_5.name=DAMAGE OVERRIDE (2.5) +item.weapon_mod_test.override_5.name=DAMAGE OVERRIDE (5) +item.weapon_mod_test.override_7_5.name=DAMAGE OVERRIDE (7.5) +item.weapon_mod_test.override_10.name=DAMAGE OVERRIDE (10) +item.weapon_mod_test.override_12_5.name=DAMAGE OVERRIDE (12.5) +item.weapon_mod_test.override_15.name=DAMAGE OVERRIDE (15) +item.weapon_mod_test.override_20.name=DAMAGE OVERRIDE (20) item.weapon_pipe_lead.name=Die Handüberbrückung item.weapon_pipe_rusty.name=Der Einstellungskorrigierer item.weapon_saw.name=Ärztlich autorisierter Mord @@ -4870,6 +4890,7 @@ tile.sellafield_slaked.name=Gelöschtes Sellafit tile.semtex.name=Semtex tile.silo_hatch.name=Siloluke tile.silo_hatch_large.name=Große Siloluke +tile.skeleton_holder.name=Oh, ich glaub' der ist tot tile.sliding_blast_door.name=Sprengtür tile.solar_mirror.name=Heliostatspiegel tile.soyuz_capsule.name=Landekapsel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index af6c9ab08..25e9ef98a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3270,6 +3270,7 @@ item.insert_polonium.name=Polonium Insert item.insert_steel.name=Heavy Steel Insert item.insert_xsapi.name=XSAPI Insert item.insert_yharonite.name=Yharonite Insert +item.item_secret.aberrator.name=Aberrator Part item.item_secret.canister.name=Composition SB-26 item.item_secret.controller.name=Proprietary Control Unit item.item_secret.selenium_steel.name=Selenium Steel @@ -4724,6 +4725,14 @@ item.wd40.name=VT-40 item.weapon_bat.name=Richard's Default item.weapon_bat_nail.name=The Cliché item.weapon_golf_club.name=Russian Mobster's Club +item.weapon_mod_caliber.bmg50.name=.50 BMG Conversion Kit +item.weapon_mod_caliber.m357.name=.357 Magnum Conversion Kit +item.weapon_mod_caliber.m44.name=.44 Magnum Conversion Kit +item.weapon_mod_caliber.p22.name=.22 LR Conversion Kit +item.weapon_mod_caliber.p45.name=.45 Conversion Kit +item.weapon_mod_caliber.p9.name=9mm Conversion Kit +item.weapon_mod_caliber.r556.name=5.56mm Conversion Kit +item.weapon_mod_caliber.r762.name=7.62mm Conversion Kit item.weapon_mod_generic.bigmt_damage.name=Optimized Saturnite Receiver item.weapon_mod_generic.bigmt_dura.name=High-Durability Saturnite Parts item.weapon_mod_generic.bronze_damage.name=Optimized Bronze Receiver @@ -4750,10 +4759,21 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernization Kit item.weapon_mod_special.saw.name=Hacksaw item.weapon_mod_special.scope.name=Scope item.weapon_mod_special.silencer.name=Silencer +item.weapon_mod_special.skin_saturnite.name=Saturnite Skin item.weapon_mod_special.slowdown.name=Gear Train item.weapon_mod_special.speedloader.name=Speedloader item.weapon_mod_special.speedup.name=Auxiliary Electric Engine item.weapon_mod_special.stack_mag.name=Double-Stacked Magazine +item.weapon_mod_test.damage.name=DAMAGE UPGRADE +item.weapon_mod_test.firerate.name=FIRE RATE UPGRADE +item.weapon_mod_test.multi.name=MULTI SHOT UPGRADE +item.weapon_mod_test.override_2_5.name=DAMAGE OVERRIDE (2.5) +item.weapon_mod_test.override_5.name=DAMAGE OVERRIDE (5) +item.weapon_mod_test.override_7_5.name=DAMAGE OVERRIDE (7.5) +item.weapon_mod_test.override_10.name=DAMAGE OVERRIDE (10) +item.weapon_mod_test.override_12_5.name=DAMAGE OVERRIDE (12.5) +item.weapon_mod_test.override_15.name=DAMAGE OVERRIDE (15) +item.weapon_mod_test.override_20.name=DAMAGE OVERRIDE (20) item.weapon_pipe_lead.name=The Manual Override item.weapon_pipe_rusty.name=The Attitude Adjuster item.weapon_saw.name=Doctor Assisted Homicide @@ -6015,6 +6035,7 @@ tile.sellafield_slaked.name=Slaked Sellafite tile.semtex.name=Semtex tile.silo_hatch.name=Silo Hatch tile.silo_hatch_large.name=Large Silo Hatch +tile.skeleton_holder.name=Oh, that's a dead guy tile.sliding_blast_door.name=Sliding Blast Door tile.solar_mirror.name=Heliostat Mirror tile.soyuz_capsule.name=Cargo Landing Capsule diff --git a/src/main/resources/assets/hbm/models/armor/taurun.obj b/src/main/resources/assets/hbm/models/armor/taurun.obj new file mode 100644 index 000000000..4590617e3 --- /dev/null +++ b/src/main/resources/assets/hbm/models/armor/taurun.obj @@ -0,0 +1,1871 @@ +# Blender v2.79 (sub 0) OBJ File: 'taurun_scaled.blend' +# www.blender.org +o RightBoot +v -4.625000 24.300001 2.625000 +v 0.625000 24.299999 2.625000 +v -4.625000 24.300001 -2.625000 +v 0.625000 24.299999 -2.625000 +v -3.575000 24.300001 -3.675000 +v -0.425000 24.299999 -3.675000 +v -3.575001 22.200003 -3.675000 +v -0.425001 22.200001 -3.675000 +v -3.575001 21.150002 -2.625000 +v -0.425001 21.150000 -2.625000 +v -4.625000 22.200003 -2.625000 +v 0.624999 22.200001 -2.625000 +v 0.099999 20.100000 -2.100000 +v -4.100001 20.100002 -2.100000 +v 0.099999 20.100000 2.100000 +v -4.100001 20.100002 2.100000 +v -4.625001 20.100002 2.625000 +v 0.624999 20.100000 2.625000 +v -4.625001 20.100002 -2.625000 +v 0.624999 20.100000 -2.625000 +vt 0.000000 0.222222 +vt 0.250000 0.000000 +vt 0.000000 -0.000000 +vt 0.300000 0.044444 +vt 0.500000 0.000000 +vt 0.250000 0.000000 +vt 0.450000 0.133333 +vt 0.450000 0.044444 +vt 0.300000 0.133333 +vt 0.450000 0.177778 +vt 0.525000 0.422222 +vt 0.750000 0.400000 +vt 0.500000 0.400000 +vt 0.500000 0.311111 +vt 0.275000 0.422222 +vt 0.250000 0.400000 +vt 0.500000 0.044444 +vt 0.500000 0.133333 +vt 0.250000 0.133333 +vt 0.250000 0.044444 +vt 0.300000 0.355556 +vt 0.300000 0.177778 +vt 0.775000 0.422222 +vt 1.000000 0.400000 +vt 0.025000 0.422222 +vt 0.000000 0.400000 +vt 0.250000 0.311111 +vt 0.750000 0.222222 +vt 1.000000 0.222222 +vt 0.250000 0.222222 +vt 0.725000 0.422222 +vt 0.500000 0.222222 +vt 0.475000 0.422222 +vt 0.450000 0.355556 +vt 0.975000 0.422222 +vt 0.225000 0.422222 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 -0.0000 -0.7071 +vn -0.5774 -0.5774 -0.5773 +vn 0.5773 -0.5773 -0.5774 +vn 1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +s off +f 2/1/1 3/2/1 1/3/1 +f 6/4/1 3/5/1 4/6/1 +f 6/4/2 7/7/2 5/8/2 +f 8/9/3 9/10/3 7/7/3 +f 14/11/4 17/12/4 19/13/4 +f 11/14/5 19/13/5 17/12/5 +f 13/15/4 19/13/4 20/16/4 +f 3/17/6 7/7/6 11/18/6 +f 12/19/7 6/4/7 4/20/7 +f 9/10/8 11/18/8 7/7/8 +f 20/16/2 19/13/2 10/21/2 +f 8/9/9 12/19/9 10/22/9 +f 16/23/4 18/24/4 17/12/4 +f 15/25/4 20/16/4 18/26/4 +f 18/26/10 12/27/10 2/1/10 +f 1/28/11 18/24/11 2/29/11 +f 2/1/1 4/30/1 3/2/1 +f 6/4/1 5/8/1 3/5/1 +f 6/4/2 8/9/2 7/7/2 +f 8/9/3 10/22/3 9/10/3 +f 14/11/4 16/31/4 17/12/4 +f 17/12/5 1/28/5 11/14/5 +f 1/28/5 3/32/5 11/14/5 +f 13/15/4 14/33/4 19/13/4 +f 3/17/6 5/8/6 7/7/6 +f 12/19/7 8/9/7 6/4/7 +f 19/13/2 11/14/2 9/34/2 +f 10/21/2 12/27/2 20/16/2 +f 19/13/2 9/34/2 10/21/2 +f 16/23/4 15/35/4 18/24/4 +f 15/25/4 13/36/4 20/16/4 +f 20/16/10 12/27/10 18/26/10 +f 12/27/10 4/30/10 2/1/10 +f 1/28/11 17/12/11 18/24/11 +o LeftBoot +v 4.625000 24.299997 2.625000 +v -0.625000 24.299999 2.625000 +v 4.625000 24.299997 -2.625000 +v -0.625000 24.299999 -2.625000 +v 3.575000 24.299997 -3.675000 +v 0.425000 24.299999 -3.675000 +v 3.574999 22.199999 -3.675000 +v 0.425000 22.200001 -3.675000 +v 3.574999 21.149998 -2.625000 +v 0.424999 21.150000 -2.625000 +v 4.625000 22.199999 -2.625000 +v -0.625001 22.200001 -2.625000 +v -0.100001 20.100000 -2.100000 +v 4.099999 20.099998 -2.100000 +v -0.100001 20.100000 2.100000 +v 4.099999 20.099998 2.100000 +v 4.624999 20.099998 2.625000 +v -0.625001 20.100000 2.625000 +v 4.624999 20.099998 -2.625000 +v -0.625001 20.100000 -2.625000 +vt 0.250000 0.000000 +vt 0.000000 0.222222 +vt 0.000000 -0.000000 +vt 0.250000 0.000000 +vt 0.450000 0.044444 +vt 0.300000 0.044444 +vt 0.300000 0.133333 +vt 0.450000 0.133333 +vt 0.300000 0.177778 +vt 0.750000 0.400000 +vt 0.525000 0.422222 +vt 0.500000 0.400000 +vt 0.500000 0.311111 +vt 0.275000 0.422222 +vt 0.250000 0.400000 +vt 0.500000 0.133333 +vt 0.500000 0.044444 +vt 0.250000 0.044444 +vt 0.250000 0.133333 +vt 0.450000 0.177778 +vt 0.450000 0.355556 +vt 1.000000 0.400000 +vt 0.775000 0.422222 +vt 0.025000 0.422222 +vt 0.000000 0.400000 +vt 0.250000 0.311111 +vt 0.750000 0.222222 +vt 1.000000 0.222222 +vt 0.250000 0.222222 +vt 0.500000 0.000000 +vt 0.725000 0.422222 +vt 0.500000 0.222222 +vt 0.475000 0.422222 +vt 0.300000 0.355556 +vt 0.975000 0.422222 +vt 0.225000 0.422222 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.5774 -0.5774 -0.5774 +vn -0.5773 -0.5773 -0.5774 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 1.0000 +s off +f 23/37/12 22/38/12 21/39/12 +f 24/40/12 25/41/12 26/42/12 +f 25/41/13 28/43/13 26/42/13 +f 27/44/14 30/45/14 28/43/14 +f 37/46/15 34/47/15 39/48/15 +f 37/46/16 39/48/16 31/49/16 +f 39/48/15 33/50/15 40/51/15 +f 31/52/17 25/41/17 23/53/17 +f 24/54/18 28/43/18 32/55/18 +f 29/56/19 27/44/19 31/52/19 +f 40/51/13 29/57/13 39/48/13 +f 28/43/20 30/45/20 32/55/20 +f 38/58/15 36/59/15 37/46/15 +f 40/51/15 35/60/15 38/61/15 +f 22/38/21 32/62/21 38/61/21 +f 38/58/22 21/63/22 22/64/22 +f 23/37/12 24/65/12 22/38/12 +f 24/40/12 23/66/12 25/41/12 +f 25/41/13 27/44/13 28/43/13 +f 27/44/14 29/56/14 30/45/14 +f 37/46/15 36/67/15 34/47/15 +f 23/68/16 21/63/16 31/49/16 +f 21/63/16 37/46/16 31/49/16 +f 39/48/15 34/69/15 33/50/15 +f 31/52/17 27/44/17 25/41/17 +f 24/54/18 26/42/18 28/43/18 +f 40/51/13 32/62/13 30/70/13 +f 29/57/13 31/49/13 39/48/13 +f 40/51/13 30/70/13 29/57/13 +f 38/58/15 35/71/15 36/59/15 +f 40/51/15 33/72/15 35/60/15 +f 24/65/21 32/62/21 22/38/21 +f 32/62/21 40/51/21 38/61/21 +f 38/58/22 37/46/22 21/63/22 +o RightArm +v -3.900008 -0.299998 2.100000 +v -3.900008 -0.299998 -2.100000 +v -8.100008 -0.299997 -2.100000 +v -8.100008 -0.299997 2.100000 +v -3.900005 9.150001 2.100000 +v -8.100005 9.150002 2.100000 +v -8.100005 9.150002 -2.100000 +v -3.900005 9.150001 -2.100000 +vt 0.250000 0.692308 +vt 0.000000 0.000000 +vt 0.000000 0.692308 +vt 0.500000 0.692308 +vt 0.250000 0.000000 +vt 1.000000 0.692308 +vt 0.750000 0.000000 +vt 0.750000 0.692308 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 1.000000 0.000000 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +s off +f 42/73/23 45/74/23 41/75/23 +f 43/76/24 48/77/24 42/73/24 +f 41/78/25 46/79/25 44/80/25 +f 44/80/26 47/81/26 43/76/26 +f 44/82/27 42/73/27 41/83/27 +f 42/73/23 48/77/23 45/74/23 +f 43/76/24 47/81/24 48/77/24 +f 41/78/25 45/84/25 46/79/25 +f 44/80/26 46/79/26 47/81/26 +f 44/82/27 43/76/27 42/73/27 +o RightLeg +v -4.100004 11.700002 2.100000 +v 0.099996 11.700001 2.100000 +v -4.100004 11.700002 -2.100000 +v 0.099996 11.700001 -2.100000 +v 0.099999 20.100000 -2.100000 +v -4.100001 20.100002 -2.100000 +v 0.099999 20.100000 2.100000 +v -4.100001 20.100002 2.100000 +vt 0.225000 0.955556 +vt 0.025000 0.777778 +vt 0.025000 0.955556 +vt 0.225000 0.422222 +vt 0.025000 0.422222 +vt 0.775000 0.422222 +vt 0.975000 0.777778 +vt 0.975000 0.422222 +vt 0.275000 0.777778 +vt 0.475000 0.422222 +vt 0.275000 0.422222 +vt 0.525000 0.777778 +vt 0.725000 0.422222 +vt 0.525000 0.422222 +vt 0.225000 0.777778 +vt 0.775000 0.777778 +vt 0.475000 0.777778 +vt 0.725000 0.777778 +vn -0.0000 -1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 51/85/28 50/86/28 49/87/28 +f 50/86/29 53/88/29 55/89/29 +f 56/90/30 50/91/30 55/92/30 +f 52/93/31 54/94/31 53/95/31 +f 51/96/32 56/97/32 54/98/32 +f 51/85/28 52/99/28 50/86/28 +f 50/86/29 52/99/29 53/88/29 +f 56/90/30 49/100/30 50/91/30 +f 52/93/31 51/101/31 54/94/31 +f 51/96/32 49/102/32 56/97/32 +o LeftLeg +v 4.099996 11.700000 2.100000 +v -0.100004 11.700001 2.100000 +v 4.099996 11.700000 -2.100000 +v -0.100004 11.700001 -2.100000 +v -0.100001 20.100000 -2.100000 +v 4.099999 20.099998 -2.100000 +v -0.100001 20.100000 2.100000 +v 4.099999 20.099998 2.100000 +vt 0.025000 0.777778 +vt 0.225000 0.955556 +vt 0.025000 0.955556 +vt 0.225000 0.422222 +vt 0.025000 0.422222 +vt 0.975000 0.422222 +vt 0.775000 0.777778 +vt 0.775000 0.422222 +vt 0.475000 0.422222 +vt 0.275000 0.777778 +vt 0.275000 0.422222 +vt 0.725000 0.422222 +vt 0.525000 0.777778 +vt 0.525000 0.422222 +vt 0.225000 0.777778 +vt 0.975000 0.777778 +vt 0.475000 0.777778 +vt 0.725000 0.777778 +vn -0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 -0.0000 0.0000 +s off +f 58/103/33 59/104/33 57/105/33 +f 61/106/34 58/103/34 63/107/34 +f 63/108/35 57/109/35 64/110/35 +f 62/111/36 60/112/36 61/113/36 +f 64/114/37 59/115/37 62/116/37 +f 58/103/33 60/117/33 59/104/33 +f 61/106/34 60/117/34 58/103/34 +f 63/108/35 58/118/35 57/109/35 +f 62/111/36 59/119/36 60/112/36 +f 64/114/37 57/120/37 59/115/37 +o LeftArm +v 3.899992 -0.300001 2.100000 +v 3.899992 -0.300001 -2.100000 +v 8.099993 -0.300002 -2.100000 +v 8.099993 -0.300002 2.100000 +v 3.899995 9.149999 2.100000 +v 8.099996 9.149997 2.100000 +v 8.099996 9.149997 -2.100000 +v 3.899995 9.149999 -2.100000 +vt 0.000000 0.000000 +vt 0.250000 0.692308 +vt 0.000000 0.692308 +vt 0.250000 0.000000 +vt 0.500000 0.692308 +vt 0.750000 0.000000 +vt 1.000000 0.692308 +vt 0.750000 0.692308 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 1.000000 0.000000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +s off +f 69/121/38 66/122/38 65/123/38 +f 72/124/39 67/125/39 66/122/39 +f 70/126/40 65/127/40 68/128/40 +f 71/129/41 68/128/41 67/125/41 +f 66/122/42 68/130/42 65/131/42 +f 69/121/38 72/124/38 66/122/38 +f 72/124/39 71/129/39 67/125/39 +f 70/126/40 69/132/40 65/127/40 +f 71/129/41 70/126/41 68/128/41 +f 66/122/42 67/125/42 68/130/42 +o Helmet +v 5.249990 -8.200003 -4.200000 +v 5.249990 -8.200003 4.200000 +v -4.200010 -8.200000 5.250000 +v 4.199989 -8.200002 5.250000 +v -4.200010 -8.200000 -5.250000 +v 4.199989 -8.200002 -5.250000 +v -5.250010 -8.199999 4.200000 +v -5.250010 -8.199999 -4.200000 +v 5.249990 -6.100002 -4.200000 +v 5.249990 -6.100002 4.200000 +v -4.200009 -6.099999 5.250000 +v 4.199990 -6.100002 5.250000 +v -4.200009 -6.099999 -5.250000 +v 4.199990 -6.100002 -5.250000 +v -5.250010 -6.099998 4.200000 +v -5.250010 -6.099998 -4.200000 +v 7.349990 -5.050002 -4.200000 +v 7.349990 -5.050002 4.200000 +v -4.200009 -5.049998 7.349999 +v 4.199991 -5.050001 7.349999 +v -4.200009 -5.049998 -7.349999 +v 4.199991 -5.050001 -7.349999 +v -7.350008 -5.049997 4.200000 +v -7.350008 -5.049997 -4.200000 +v -3.150011 -10.299998 3.150000 +v -3.150011 -10.299998 -3.150000 +v 3.149989 -10.300000 -3.150000 +v 3.149989 -10.300000 3.150000 +v 4.724989 -8.200003 -3.675000 +v 4.724989 -8.200003 3.675000 +v -3.675010 -8.200000 4.725000 +v 3.674989 -8.200002 4.725000 +v -3.675010 -8.200000 -4.725000 +v 3.674989 -8.200002 -4.725000 +v -4.725010 -8.199999 3.675000 +v -4.725010 -8.199999 -3.675000 +v 4.724992 0.199999 -3.675000 +v 4.724992 0.199999 3.675000 +v -3.675008 0.200002 4.725000 +v 3.674992 0.200000 4.725000 +v -3.675008 0.200002 -4.725000 +v 3.674992 0.200000 -4.725000 +v -4.725008 0.200002 3.675000 +v -4.725008 0.200002 -3.675000 +v -3.675007 1.250001 3.675000 +v -3.675007 1.250001 -3.675000 +v 3.674992 1.249999 -3.675000 +v 3.674992 1.249999 3.675000 +v 1.574991 -2.950001 -4.725000 +v -1.575009 -2.950000 -4.725000 +v 1.574992 0.200000 -4.725000 +v -1.575008 0.200001 -4.725000 +v 1.574992 0.200000 -5.775000 +v 1.574991 -1.900000 -5.775000 +v -1.575008 -1.899999 -5.775000 +v -1.575008 0.200001 -5.775000 +v -2.100010 -5.575000 -4.725000 +v -0.736019 -4.787500 -4.725000 +v -0.736019 -3.212499 -4.725000 +v -2.100008 -2.424999 -4.725000 +v -3.463999 -3.212498 -4.725000 +v -3.463999 -4.787499 -4.725000 +v 2.099990 -5.575001 -4.725000 +v 3.463980 -4.787501 -4.725000 +v 3.463981 -3.212501 -4.725000 +v 2.099991 -2.425000 -4.725000 +v 0.736001 -3.212500 -4.725000 +v 0.736001 -4.787501 -4.725000 +v 2.099990 -5.575001 -5.250000 +v 3.463980 -4.787501 -5.250000 +v 3.463981 -3.212501 -5.250000 +v 2.099991 -2.425000 -5.250000 +v 0.736001 -3.212500 -5.250000 +v 0.736001 -4.787501 -5.250000 +v -2.100010 -5.575000 -5.250000 +v -0.736019 -4.787500 -5.250000 +v -0.736019 -3.212499 -5.250000 +v -2.100008 -2.424999 -5.250000 +v -3.463999 -3.212498 -5.250000 +v -3.463999 -4.787499 -5.250000 +v 1.574993 1.377384 -5.467462 +v 1.049993 1.748615 -5.096232 +v -1.050007 1.748616 -5.096232 +v -1.575007 1.377385 -5.467462 +v 1.049992 -0.478770 -7.323617 +v 1.574992 -0.107537 -6.952385 +v -1.575008 -0.107536 -6.952385 +v -1.050008 -0.478769 -7.323617 +v 1.574993 1.377388 -8.437310 +v 1.049992 1.006157 -8.808541 +v 1.049993 3.233541 -6.581155 +v 1.574993 2.862312 -6.952386 +v -1.575007 2.862313 -6.952386 +v -1.050007 3.233542 -6.581155 +v -1.050007 1.006157 -8.808541 +v -1.575007 1.377388 -8.437310 +v 1.049992 -0.478770 -4.353768 +v 0.524992 -0.107536 -3.982538 +v -0.525008 -0.107536 -3.982538 +v -1.050008 -0.478769 -4.353768 +v 0.524992 -1.592463 -5.467462 +v 1.049992 -1.221232 -5.096231 +v -1.050008 -1.221231 -5.096231 +v -0.525008 -1.592462 -5.467462 +v 1.049992 0.263694 -6.581154 +v 0.524992 -0.107536 -6.952386 +v 0.524993 1.377384 -5.467462 +v 1.049992 1.006153 -5.838693 +v -1.050007 1.006153 -5.838693 +v -0.525007 1.377384 -5.467462 +v -0.525008 -0.107536 -6.952386 +v -1.050008 0.263695 -6.581154 +v 1.443740 -6.625000 -5.355000 +v -1.443760 -6.625000 -5.355000 +v 1.443739 -8.200001 -5.355000 +v -1.443760 -8.200001 -5.355000 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.720000 0.046512 +vt 0.640000 0.093023 +vt 0.640000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.046512 +vt 0.720000 0.046512 +vt 0.640000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.093023 +vt 0.640000 0.093023 +vt 0.720000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.046512 +vt 0.760000 0.000000 +vt 0.600000 0.000000 +vt 0.720000 0.046512 +vt 0.280000 0.000000 +vt 0.600000 0.000000 +vt 0.280000 0.046512 +vt 0.600000 -0.000000 +vt 0.760000 0.000000 +vt 0.280000 0.046512 +vt 0.600000 -0.000000 +vt 0.760000 0.000000 +vt 0.280000 -0.000000 +vt 0.280000 0.046512 +vt 0.560000 0.162791 +vt 0.320000 0.302326 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.680000 0.162791 +vt 0.680000 0.162791 +vt 0.720000 0.093023 +vt 0.680000 0.162791 +vt 0.640000 0.093023 +vt 0.680000 0.162791 +vt 0.320000 0.372093 +vt 0.280000 0.186047 +vt 0.320000 0.186047 +vt -0.000000 0.372093 +vt 0.280000 0.372093 +vt 0.000000 0.744186 +vt 0.280000 0.558140 +vt 0.280000 0.744186 +vt 0.920000 0.558140 +vt 0.960000 0.744186 +vt 0.920000 0.744186 +vt 0.320000 0.558140 +vt 0.320000 0.744186 +vt 0.640000 0.744186 +vt 0.600000 0.744186 +vt 0.640000 0.558140 +vt -0.000000 -0.000000 +vt 0.280000 0.162791 +vt -0.000000 0.162791 +vt -0.000000 0.186047 +vt 0.920000 0.534884 +vt 0.940000 0.534884 +vt 0.960000 0.558140 +vt 0.000000 0.558140 +vt 0.280000 0.534884 +vt 0.300000 0.162791 +vt 0.320000 0.534884 +vt 0.600000 0.558140 +vt 0.300000 0.534884 +vt 0.620000 0.534884 +vt 0.040000 0.441860 +vt 0.160000 0.395349 +vt 0.160000 0.441860 +vt 0.160000 0.372093 +vt 0.040000 0.395349 +vt 0.040000 0.372093 +vt 0.040000 0.465116 +vt 0.160000 0.465116 +vt -0.000000 0.395349 +vt -0.000000 0.465116 +vt 0.200000 0.395349 +vt 0.280000 0.372093 +vt 0.320000 0.418605 +vt 0.280000 0.418605 +vt 0.400000 0.418605 +vt 0.440000 0.372093 +vt 0.440000 0.418605 +vt 0.220000 0.372093 +vt 0.260000 0.418605 +vt 0.220000 0.418605 +vt 0.660000 0.465116 +vt 0.740000 0.418605 +vt 0.740000 0.465116 +vt 0.440000 0.406977 +vt 0.440000 0.360465 +vt 0.460000 0.348837 +vt 0.360000 0.465116 +vt 0.440000 0.418605 +vt 0.440000 0.465116 +vt 0.460000 0.465116 +vt 0.540000 0.418605 +vt 0.540000 0.465116 +vt 0.560000 0.476744 +vt 0.800000 0.406977 +vt 0.740000 0.395349 +vt 0.800000 0.395349 +vt 0.920000 0.406977 +vt 0.860000 0.395349 +vt 0.920000 0.395349 +vt 0.680000 0.406977 +vt 0.620000 0.395349 +vt 0.680000 0.395349 +vt 0.860000 0.406977 +vt 0.620000 0.406977 +vt 0.560000 0.395349 +vt 0.740000 0.406977 +vt 0.770035 0.411685 +vt 0.829965 0.411685 +vt 0.859930 0.441860 +vt 0.620000 0.406977 +vt 0.560000 0.395349 +vt 0.620000 0.395349 +vt 0.740000 0.406977 +vt 0.680000 0.395349 +vt 0.740000 0.395349 +vt 0.800000 0.406977 +vt 0.800000 0.395349 +vt 0.920000 0.406977 +vt 0.860000 0.395349 +vt 0.920000 0.395349 +vt 0.680000 0.406977 +vt 0.860000 0.406977 +vt 0.770035 0.411685 +vt 0.829965 0.411685 +vt 0.859930 0.441860 +vt 0.460000 0.418605 +vt 0.560000 0.465116 +vt 0.560000 0.418605 +vt 0.640000 0.418605 +vt 0.640000 0.465116 +vt 0.340000 0.418605 +vt 0.360000 0.418605 +vt 0.200000 0.418605 +vt 0.200000 0.372093 +vt 0.380000 0.372093 +vt 0.380000 0.418605 +vt 0.340000 0.418605 +vt 0.320000 0.372093 +vt 0.340000 0.372093 +vt 1.000000 0.302326 +vt 0.560000 0.162791 +vt 1.000000 0.162791 +vt 0.280000 0.046512 +vt 0.760000 0.000000 +vt 0.280000 -0.000000 +vt 0.280000 -0.000000 +vt 0.560000 0.302326 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.320000 0.162791 +vt 0.280000 -0.000000 +vt 0.640000 0.534884 +vt 0.000000 0.534884 +vt 0.600000 0.534884 +vt 0.200000 0.465116 +vt 0.400000 0.372093 +vt 0.260000 0.372093 +vt 0.660000 0.418605 +vt 0.540000 0.348837 +vt 0.560000 0.360465 +vt 0.560000 0.406977 +vt 0.560000 0.523256 +vt 0.540000 0.534884 +vt 0.460000 0.534884 +vt 0.440000 0.523256 +vt 0.440000 0.476744 +vt 0.560000 0.406977 +vt 0.829965 0.472036 +vt 0.770035 0.472036 +vt 0.740070 0.441860 +vt 0.560000 0.406977 +vt 0.829965 0.472036 +vt 0.770035 0.472036 +vt 0.740070 0.441860 +vt 0.340000 0.465116 +vt 0.560000 0.302326 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn 0.7071 -0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.4082 -0.8165 -0.4082 +vn -0.4082 -0.8165 0.4082 +vn -0.0000 -0.8944 -0.4472 +vn 0.4472 -0.8944 0.0000 +vn 0.4082 -0.8165 0.4082 +vn -0.4472 -0.8944 0.0000 +vn 0.4082 -0.8165 -0.4082 +vn -0.0000 -0.8944 0.4472 +vn -0.0000 -1.0000 0.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.7071 -0.7071 0.0000 +vn -0.0000 -0.7071 0.7071 +vn -0.7071 -0.7071 0.0000 +vn -0.4851 -0.7276 0.4851 +vn -0.4851 -0.7276 -0.4851 +vn 0.4851 -0.7276 -0.4851 +vn 0.4851 -0.7276 0.4851 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.5774 0.5774 -0.5774 +vn 0.7071 0.7071 0.0000 +vn 0.5774 0.5774 -0.5774 +vn 0.0000 0.7071 0.7071 +vn 0.5774 0.5774 0.5774 +vn -0.5774 0.5774 0.5774 +vn -0.5000 -0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -0.7071 -0.5000 -0.5000 +vn 0.7071 -0.5000 -0.5000 +vn 0.7071 0.5000 0.5000 +vn -0.7071 0.5000 0.5000 +s off +f 76/133/43 83/134/43 75/135/43 +f 77/136/44 86/137/44 78/138/44 +f 73/139/45 82/140/45 74/141/45 +f 79/142/46 88/143/46 80/144/46 +f 81/145/47 78/146/47 86/147/47 +f 76/148/48 82/149/48 84/150/48 +f 83/151/49 79/152/49 75/153/49 +f 80/154/50 85/155/50 77/156/50 +f 88/157/51 93/158/51 85/155/51 +f 91/159/52 87/160/52 83/151/52 +f 86/137/53 93/161/53 94/162/53 +f 81/163/54 90/164/54 82/140/54 +f 82/149/55 92/165/55 84/150/55 +f 87/166/56 96/167/56 88/143/56 +f 86/147/57 89/168/57 81/145/57 +f 92/169/58 83/134/58 84/170/58 +f 99/171/59 97/172/59 98/173/59 +f 99/171/60 77/136/60 78/138/60 +f 100/174/61 73/139/61 74/141/61 +f 75/135/62 100/175/62 76/133/62 +f 98/176/63 79/142/63 80/144/63 +f 79/152/64 97/177/64 75/153/64 +f 80/154/65 77/156/65 98/178/65 +f 73/179/66 99/180/66 78/146/66 +f 74/181/67 76/148/67 100/182/67 +f 101/183/47 114/184/47 109/185/47 +f 105/186/44 114/184/44 106/187/44 +f 101/188/45 110/189/45 102/190/45 +f 116/191/50 105/192/50 108/193/50 +f 102/190/48 112/194/48 104/195/48 +f 107/196/46 116/191/46 108/193/46 +f 112/194/43 103/197/43 104/195/43 +f 103/197/49 115/198/49 107/196/49 +f 117/199/68 119/200/68 118/201/68 +f 113/202/69 119/200/69 114/184/69 +f 115/198/70 118/203/70 116/191/70 +f 116/191/71 118/204/71 113/205/71 +f 109/206/72 120/207/72 110/189/72 +f 109/185/73 114/184/73 119/208/73 +f 120/209/74 111/210/74 112/194/74 +f 110/189/75 120/211/75 112/194/75 +f 115/198/76 111/210/76 117/212/76 +f 127/213/44 125/214/44 126/215/44 +f 123/216/68 128/217/68 124/218/68 +f 122/219/60 126/215/60 121/220/60 +f 124/221/46 127/213/46 122/222/46 +f 123/223/45 126/215/45 125/214/45 +f 183/224/60 173/225/60 176/226/60 +f 170/227/74 182/228/74 171/229/74 +f 181/230/46 175/231/46 172/232/46 +f 154/233/74 166/234/74 155/235/74 +f 168/236/69 165/237/69 166/238/69 +f 156/239/46 168/240/46 159/241/46 +f 160/242/60 162/243/60 157/244/60 +f 160/242/62 157/244/62 158/245/62 +f 146/246/77 135/247/77 140/248/77 +f 144/249/78 139/250/78 138/251/78 +f 142/252/45 137/253/45 136/254/45 +f 145/255/46 140/248/46 139/250/46 +f 143/256/79 138/257/79 137/253/79 +f 141/258/80 136/254/80 135/247/80 +f 145/259/44 144/260/44 143/261/44 +f 149/262/79 132/263/79 131/264/79 +f 147/265/80 130/266/80 129/267/80 +f 152/268/77 129/267/77 134/269/77 +f 150/270/78 133/271/78 132/272/78 +f 148/273/45 131/264/45 130/266/45 +f 151/274/46 134/269/46 133/271/46 +f 151/275/44 150/276/44 149/277/44 +f 159/241/81 167/278/81 160/242/81 +f 158/279/82 162/243/82 161/280/82 +f 164/281/83 154/233/83 153/282/83 +f 156/239/84 166/283/84 165/284/84 +f 153/282/45 161/280/45 164/281/45 +f 175/231/81 183/224/81 176/226/81 +f 181/230/84 171/285/84 182/286/84 +f 180/287/83 170/227/83 169/288/83 +f 174/289/82 178/290/82 177/291/82 +f 174/289/45 180/287/45 169/288/45 +f 187/292/44 186/293/44 185/294/44 +f 76/133/43 84/170/43 83/134/43 +f 77/136/44 85/295/44 86/137/44 +f 73/139/45 81/163/45 82/140/45 +f 79/142/46 87/166/46 88/143/46 +f 81/145/47 73/179/47 78/146/47 +f 76/148/48 74/181/48 82/149/48 +f 83/151/49 87/160/49 79/152/49 +f 80/154/50 88/157/50 85/155/50 +f 88/157/51 96/167/51 93/158/51 +f 91/159/52 95/296/52 87/160/52 +f 86/137/53 85/295/53 93/161/53 +f 81/163/54 89/297/54 90/164/54 +f 82/149/55 90/164/55 92/165/55 +f 87/166/56 95/298/56 96/167/56 +f 86/147/57 94/162/57 89/168/57 +f 92/169/58 91/159/58 83/134/58 +f 99/171/59 100/299/59 97/172/59 +f 99/171/60 98/173/60 77/136/60 +f 100/174/61 99/300/61 73/139/61 +f 75/135/62 97/301/62 100/175/62 +f 98/176/63 97/302/63 79/142/63 +f 101/183/47 106/187/47 114/184/47 +f 105/186/44 113/202/44 114/184/44 +f 101/188/45 109/206/45 110/189/45 +f 116/191/50 113/205/50 105/192/50 +f 102/190/48 110/189/48 112/194/48 +f 107/196/46 115/198/46 116/191/46 +f 112/194/43 111/210/43 103/197/43 +f 103/197/49 111/210/49 115/198/49 +f 117/199/68 120/303/68 119/200/68 +f 113/202/69 118/201/69 119/200/69 +f 115/198/70 117/304/70 118/203/70 +f 109/206/72 119/305/72 120/207/72 +f 120/209/74 117/306/74 111/210/74 +f 127/213/44 128/217/44 125/214/44 +f 123/216/68 125/214/68 128/217/68 +f 122/219/60 127/213/60 126/215/60 +f 124/221/46 128/217/46 127/213/46 +f 123/223/45 121/307/45 126/215/45 +f 183/224/60 178/290/60 173/225/60 +f 170/227/74 179/308/74 182/228/74 +f 181/230/46 184/309/46 175/231/46 +f 154/233/74 163/310/74 166/234/74 +f 166/238/69 163/311/69 162/243/69 +f 163/311/69 164/312/69 162/243/69 +f 164/312/69 161/313/69 162/243/69 +f 162/243/69 167/278/69 166/238/69 +f 167/278/69 168/236/69 166/238/69 +f 156/239/46 165/284/46 168/240/46 +f 160/242/60 167/278/60 162/243/60 +f 158/245/62 153/314/62 154/315/62 +f 154/315/62 155/316/62 158/245/62 +f 155/316/62 156/317/62 158/245/62 +f 156/317/62 159/318/62 158/245/62 +f 159/318/62 160/242/62 158/245/62 +f 146/246/77 141/258/77 135/247/77 +f 144/249/78 145/255/78 139/250/78 +f 142/252/45 143/256/45 137/253/45 +f 145/255/46 146/246/46 140/248/46 +f 143/256/79 144/319/79 138/257/79 +f 141/258/80 142/252/80 136/254/80 +f 143/261/44 142/320/44 145/259/44 +f 142/320/44 141/321/44 145/259/44 +f 141/321/44 146/322/44 145/259/44 +f 149/262/79 150/323/79 132/263/79 +f 147/265/80 148/273/80 130/266/80 +f 152/268/77 147/265/77 129/267/77 +f 150/270/78 151/274/78 133/271/78 +f 148/273/45 149/262/45 131/264/45 +f 151/274/46 152/268/46 134/269/46 +f 149/277/44 148/324/44 151/275/44 +f 148/324/44 147/325/44 151/275/44 +f 147/325/44 152/326/44 151/275/44 +f 159/241/81 168/240/81 167/278/81 +f 158/279/82 157/244/82 162/243/82 +f 164/281/83 163/310/83 154/233/83 +f 156/239/84 155/327/84 166/283/84 +f 153/282/45 158/279/45 161/280/45 +f 175/231/81 184/309/81 183/224/81 +f 181/230/84 172/232/84 171/285/84 +f 180/287/83 179/308/83 170/227/83 +f 174/289/82 173/225/82 178/290/82 +f 174/289/45 177/291/45 180/287/45 +f 187/292/44 188/328/44 186/293/44 +o Chest +v 4.199992 -0.300001 2.100000 +v 4.199992 -0.300001 -2.100000 +v -4.200007 -0.299998 -2.100000 +v -4.200007 -0.299998 2.100000 +v 4.199994 7.994998 -2.100000 +v -4.200005 7.995000 -2.100000 +v 4.199995 10.094998 -2.100000 +v -4.200004 10.095000 -2.100000 +v 4.199995 10.094998 -2.625000 +v 4.199994 7.994998 -2.625000 +v -4.200005 7.995000 -2.625000 +v -4.200004 10.095000 -2.625000 +v 4.199994 7.994998 2.100000 +v -4.200005 7.995000 2.100000 +v 4.199995 10.094998 2.100000 +v -4.200004 10.095000 2.100000 +v 4.199994 7.994998 2.625000 +v -4.200005 7.995000 2.625000 +v 4.199995 10.094998 2.625000 +v -4.200004 10.095000 2.625000 +v -4.725005 7.995000 -2.100000 +v -4.725004 10.095001 -2.100000 +v -4.725005 7.995000 2.100000 +v -4.725004 10.095001 2.100000 +v 4.724995 7.994998 -2.100000 +v 4.724996 10.094997 -2.100000 +v 4.724995 7.994998 2.100000 +v 4.724996 10.094997 2.100000 +v -4.200005 9.150001 2.100000 +v -4.200005 9.150001 -2.100000 +v 4.199995 9.149999 2.100000 +v 4.199995 9.149999 -2.100000 +v -4.200000 22.800001 5.250000 +v 4.200000 22.799997 5.250000 +v 5.249998 17.549997 2.100000 +v 5.249998 17.549997 -2.100000 +v -5.250002 17.550001 2.100000 +v -5.250002 17.550001 -2.100000 +v -0.000005 9.150000 -2.100000 +v -4.200002 15.450001 -3.150000 +v -2.100003 15.450001 -3.150000 +v 4.199997 15.449999 -3.150000 +v 2.099997 15.449999 -3.150000 +v 4.199996 12.299998 2.100000 +v 4.199996 12.299998 -2.100000 +v -4.200004 12.300000 -2.100000 +v -4.200004 12.300000 2.100000 +v 3.149995 11.249999 3.150000 +v -3.150004 11.250001 3.150000 +v 3.149992 0.749999 3.150000 +v -3.150007 0.750001 3.150000 +v 3.149992 0.749999 5.250000 +v -3.150007 0.750001 5.250000 +v 3.149993 2.849999 7.349999 +v 3.149995 11.249999 7.349999 +v -3.150004 11.250001 7.349999 +v -3.150007 2.850001 7.349999 +v 4.199993 4.949999 6.300000 +v 4.199995 10.199999 6.300000 +v 4.199995 10.199999 4.200000 +v 4.199993 4.949999 4.200000 +v 3.149995 11.249999 6.300000 +v 3.149993 4.950000 6.300000 +v 3.149995 11.249999 4.200000 +v 3.149993 4.950000 4.200000 +v 3.937494 4.949999 5.512500 +v 3.412494 4.950000 5.512500 +v 3.937494 4.949999 4.987500 +v 3.412494 4.950000 4.987500 +v 3.412493 3.899998 4.987500 +v 3.937493 3.899998 4.987500 +v 3.412493 3.899998 5.512500 +v 3.937493 3.899998 5.512500 +v 4.199993 3.899998 6.300000 +v 4.199993 3.899998 4.200000 +v 3.149993 3.899999 6.300000 +v 3.149993 3.899999 4.200000 +v 4.199992 1.799998 4.200000 +v 3.674992 1.799998 4.200000 +v 3.674992 1.799998 6.300000 +v 4.199992 1.799998 6.300000 +v 3.674993 3.899998 6.825000 +v 4.199993 3.899998 6.825000 +v 3.674993 2.849999 6.825000 +v 4.199993 2.849999 6.825000 +v 4.199993 3.899998 3.675000 +v 3.674993 3.899998 3.675000 +v 4.199993 2.849999 3.675000 +v 3.674993 2.849999 3.675000 +v -4.200006 4.950002 6.300000 +v -4.200004 10.200001 6.300000 +v -4.200004 10.200001 4.200000 +v -4.200006 4.950002 4.200000 +v -3.150006 4.950002 4.200000 +v -3.150004 11.250001 4.200000 +v -3.150006 4.950002 6.300000 +v -3.150004 11.250001 6.300000 +v -3.412506 4.950002 5.512500 +v -3.937506 4.950002 5.512500 +v -3.412506 4.950002 4.987500 +v -3.937506 4.950002 4.987500 +v -3.412507 1.800000 4.987500 +v -3.412507 1.800000 5.512500 +v -3.937507 1.800001 5.512500 +v -3.937507 1.800001 4.987500 +v -3.150007 2.325002 4.725000 +v -3.150007 2.325002 5.775000 +v -4.200006 2.325002 5.775000 +v -4.200006 2.325002 4.725000 +v -3.150007 3.900001 4.725000 +v -3.150007 3.900001 5.775000 +v -4.200006 3.900001 5.775000 +v -4.200006 3.900001 4.725000 +v -3.412507 2.587501 5.775000 +v -3.937507 2.587501 5.775000 +v -3.412507 3.637502 5.775000 +v -3.937506 3.637502 5.775000 +v -3.412507 3.112500 6.825000 +v -3.937507 3.112500 6.825000 +v -3.412507 3.637502 6.825000 +v -3.937506 3.637502 6.825000 +v -3.412507 3.637502 7.875000 +v -3.937506 3.637502 7.875000 +v -3.412506 4.162501 7.875000 +v -3.937506 4.162502 7.875000 +v -3.412507 2.587501 4.725000 +v -3.937507 2.587501 4.725000 +v -3.412507 3.637502 4.725000 +v -3.937506 3.637502 4.725000 +v -3.412507 3.112500 3.675000 +v -3.937507 3.112500 3.675000 +v -3.412507 3.637502 3.675000 +v -3.937506 3.637502 3.675000 +v -3.412507 3.637502 2.625000 +v -3.937506 3.637502 2.625000 +v -3.412506 4.162501 2.625000 +v -3.937506 4.162502 2.625000 +v 4.199993 0.749999 6.300000 +v -4.200007 0.750001 6.300000 +v 4.199993 2.234923 6.915076 +v -4.200006 2.234926 6.915076 +v 4.199994 2.849999 8.400000 +v -4.200006 2.850002 8.400000 +v 4.199993 2.234923 9.884923 +v -4.200006 2.234926 9.884923 +v 4.199993 0.749999 10.500000 +v -4.200006 0.750001 10.500000 +v 4.199991 -0.734926 9.884923 +v -4.200008 -0.734923 9.884923 +v 4.199991 -1.350000 8.400000 +v -4.200008 -1.349997 8.400000 +v 4.199991 -0.734926 6.915076 +v -4.200008 -0.734923 6.915076 +v 2.099995 10.199999 7.349999 +v -2.100004 10.200001 7.349999 +v 2.099994 6.000000 7.349999 +v -2.100006 6.000000 7.349999 +v 2.099994 6.000000 9.450000 +v 2.099995 10.199999 9.450000 +v -2.100004 10.200001 9.450000 +v -2.100006 6.000000 9.450000 +v 2.957832 11.899478 6.163495 +v 3.412495 11.874217 5.902212 +v 3.412496 11.899478 6.163495 +v 3.412495 8.764097 6.466626 +v 3.185164 11.912108 6.294134 +v 3.185163 8.776729 6.597267 +v 3.185164 11.937369 6.555416 +v 3.185163 8.801990 6.858547 +v 3.412496 11.950000 6.686055 +v 3.412495 8.814620 6.989188 +v 3.639827 11.937369 6.555416 +v 3.639826 8.801990 6.858547 +v 3.639827 11.912108 6.294134 +v 3.639826 8.776729 6.597267 +v 2.957832 11.950000 6.686055 +v 3.412495 11.975261 6.947338 +v 3.867158 11.950000 6.686055 +v 3.867158 11.899478 6.163495 +v 4.094491 12.931973 5.931808 +v 3.412496 12.894082 5.539885 +v 4.094491 13.007758 6.715653 +v 3.412496 13.045648 7.107575 +v 2.730501 13.007758 6.715653 +v 2.730501 12.931973 5.931808 +v 4.094491 13.977101 5.830763 +v 3.412496 13.939210 5.438842 +v 4.094491 14.052884 6.614610 +v 3.412496 14.090775 7.006532 +v 2.730501 14.052884 6.614610 +v 2.730501 13.977101 5.830763 +v 2.957832 12.447959 7.446981 +v 3.412496 12.491173 7.188064 +v 3.412496 12.447959 7.446981 +v 3.412495 9.340938 6.928412 +v 3.185164 12.426353 7.576441 +v 3.185163 9.319330 7.057871 +v 3.185164 12.383138 7.835360 +v 3.185163 9.276116 7.316791 +v 3.412496 12.361531 7.964818 +v 3.412495 9.254509 7.446248 +v 3.639827 12.383138 7.835360 +v 3.639826 9.276116 7.316791 +v 3.639827 12.426353 7.576441 +v 3.639826 9.319330 7.057871 +v 2.957832 12.361531 7.964818 +v 3.412496 12.318316 8.223737 +v 3.867159 12.361531 7.964818 +v 3.867159 12.447959 7.446981 +v 4.094491 13.505240 7.490378 +v 3.412496 13.570062 7.102001 +v 4.094491 13.375598 8.267134 +v 3.412496 13.310778 8.655512 +v 2.730501 13.375598 8.267134 +v 2.730501 13.505240 7.490378 +v 4.094491 14.540915 7.663234 +v 3.412496 14.605736 7.274856 +v 4.094491 14.411272 8.439990 +v 3.412496 14.346450 8.828368 +v 2.730502 14.411272 8.439990 +v 2.730502 14.540915 7.663234 +vt 0.333333 0.400000 +vt 0.481481 0.387500 +vt 0.481481 0.400000 +vt 0.240741 0.387500 +vt 0.092593 0.337500 +vt 0.240741 0.337500 +vt 0.240741 0.325000 +vt 0.092593 0.325000 +vt 0.092593 0.400000 +vt 0.240741 0.400000 +vt 0.092593 0.325000 +vt 0.166667 0.125000 +vt 0.166667 0.325000 +vt 0.203704 0.325000 +vt 0.351852 0.000000 +vt 0.351852 0.325000 +vt 0.481481 0.325000 +vt 0.333333 0.337500 +vt 0.333333 0.325000 +vt 0.481481 0.337500 +vt 0.333333 0.387500 +vt 0.009259 0.400000 +vt 0.083333 0.387500 +vt 0.083333 0.400000 +vt 0.083333 0.325000 +vt 0.009259 0.337500 +vt 0.009259 0.325000 +vt 0.250000 0.400000 +vt 0.324074 0.387500 +vt 0.324074 0.400000 +vt 0.324074 0.325000 +vt 0.250000 0.337500 +vt 0.250000 0.325000 +vt 0.324074 0.337500 +vt 0.083333 0.337500 +vt 0.092593 0.387500 +vt 0.083333 0.400000 +vt 0.083333 0.325000 +vt 0.000000 0.325000 +vt -0.000000 0.337500 +vt 0.009259 0.387500 +vt -0.000000 0.387500 +vt 0.000000 0.400000 +vt 0.324074 0.325000 +vt 0.324074 0.400000 +vt 0.240741 0.325000 +vt 0.250000 0.387500 +vt 0.240741 0.400000 +vt 0.388889 0.325000 +vt 0.462963 0.125000 +vt 0.462963 0.325000 +vt 0.203704 0.000000 +vt 0.388889 0.125000 +vt 0.481481 0.325000 +vt 0.518519 0.175000 +vt 0.555556 0.325000 +vt 0.074074 0.325000 +vt 0.037037 0.175000 +vt 0.074074 0.175000 +vt 0.481481 0.175000 +vt 0.092593 0.125000 +vt 0.296296 0.400000 +vt 0.444444 0.700000 +vt 0.296296 0.700000 +vt 0.222222 0.700000 +vt 0.074074 0.700000 +vt 0.222222 0.400000 +vt 0.000000 0.700000 +vt 0.074074 0.400000 +vt 0.222222 0.800000 +vt 0.555556 0.775000 +vt 0.444444 0.525000 +vt 0.555556 0.525000 +vt 0.629630 0.825000 +vt 0.740741 0.775000 +vt 0.740741 0.825000 +vt 0.740741 0.725000 +vt 0.814815 0.525000 +vt 0.814815 0.775000 +vt 0.740741 0.525000 +vt 0.629630 0.425000 +vt 0.740741 0.425000 +vt 0.629630 0.725000 +vt 0.629630 0.525000 +vt 0.629630 0.775000 +vt 0.592593 0.775000 +vt 0.537037 0.850000 +vt 0.500000 0.900000 +vt 0.500000 0.850000 +vt 0.555556 0.900000 +vt 0.546296 0.875000 +vt 0.555556 0.875000 +vt 0.500000 0.775000 +vt 0.500000 0.825000 +vt 0.490741 0.800000 +vt 0.018519 0.850000 +vt 0.055556 0.875000 +vt 0.018519 0.875000 +vt 0.453704 0.775000 +vt 0.444444 0.800000 +vt 0.444444 0.775000 +vt 0.018519 0.700000 +vt 0.055556 0.725000 +vt 0.018519 0.725000 +vt 0.462963 0.775000 +vt 0.453704 0.800000 +vt 0.074074 0.850000 +vt 0.074074 0.700000 +vt 0.472222 0.800000 +vt 0.462963 0.800000 +vt 0.537037 0.912500 +vt 0.500000 0.912500 +vt 0.481481 0.775000 +vt 0.472222 0.775000 +vt 0.000000 0.850000 +vt 0.000000 0.700000 +vt 0.055556 0.850000 +vt 0.537037 0.825000 +vt 0.537037 0.775000 +vt 0.555556 0.850000 +vt 0.546296 0.850000 +vt 0.546296 0.837500 +vt 0.537037 0.900000 +vt 0.546296 0.800000 +vt 0.546296 0.825000 +vt 0.490741 0.850000 +vt 0.481481 0.875000 +vt 0.481481 0.850000 +vt 0.481481 0.900000 +vt 0.490741 0.875000 +vt 0.490741 0.900000 +vt 0.490741 0.837500 +vt 0.055556 0.725000 +vt 0.018519 0.850000 +vt 0.018519 0.725000 +vt 0.611111 0.887500 +vt 0.629630 0.912500 +vt 0.611111 0.912500 +vt 0.000000 0.850000 +vt 0.000000 0.700000 +vt 0.074074 0.850000 +vt 0.055556 0.850000 +vt 0.055556 0.700000 +vt 0.018519 0.875000 +vt 0.564815 0.850000 +vt 0.574074 0.862500 +vt 0.564815 0.862500 +vt 0.583333 0.775000 +vt 0.574074 0.850000 +vt 0.574074 0.775000 +vt 0.564815 0.775000 +vt 0.555556 0.850000 +vt 0.555556 0.775000 +vt 0.592593 0.775000 +vt 0.583333 0.850000 +vt 0.629630 0.825000 +vt 0.611111 0.850000 +vt 0.611111 0.825000 +vt 0.629630 0.887500 +vt 0.648148 0.850000 +vt 0.666667 0.887500 +vt 0.648148 0.887500 +vt 0.592593 0.850000 +vt 0.592593 0.887500 +vt 0.666667 0.862500 +vt 0.675926 0.837500 +vt 0.675926 0.862500 +vt 0.666667 0.887500 +vt 0.675926 0.887500 +vt 0.694444 0.887500 +vt 0.703704 0.862500 +vt 0.703704 0.887500 +vt 0.685185 0.862500 +vt 0.694444 0.862500 +vt 0.685185 0.887500 +vt 0.675926 0.825000 +vt 0.685185 0.837500 +vt 0.703704 0.837500 +vt 0.694444 0.837500 +vt 0.694444 0.862500 +vt 0.685185 0.837500 +vt 0.694444 0.837500 +vt 0.694444 0.887500 +vt 0.685185 0.862500 +vt 0.703704 0.862500 +vt 0.703704 0.887500 +vt 0.666667 0.887500 +vt 0.675926 0.862500 +vt 0.675926 0.887500 +vt 0.685185 0.887500 +vt 0.675926 0.837500 +vt 0.685185 0.825000 +vt 0.703704 0.837500 +vt 0.666667 0.862500 +vt 0.814815 0.662500 +vt 0.962963 0.700000 +vt 0.814815 0.700000 +vt 0.962963 0.737500 +vt 0.814815 0.737500 +vt 0.962963 0.437500 +vt 0.814815 0.475000 +vt 0.814815 0.437500 +vt 0.962963 0.475000 +vt 0.814815 0.512500 +vt 0.962963 0.512500 +vt 0.814815 0.550000 +vt 0.962963 0.550000 +vt 0.814815 0.587500 +vt 0.937455 0.253064 +vt 0.962963 0.238801 +vt 0.962963 0.336199 +vt 0.962963 0.625000 +vt 0.814815 0.625000 +vt 0.962963 0.662500 +vt 0.937455 0.421935 +vt 0.937455 0.353064 +vt 0.988471 0.353064 +vt 0.814815 0.225000 +vt 0.740741 0.325000 +vt 0.740741 0.225000 +vt 0.740741 0.375000 +vt 0.814815 0.325000 +vt 0.814815 0.375000 +vt 0.814815 0.175000 +vt 0.740741 0.175000 +vt 0.851852 0.325000 +vt 0.851852 0.225000 +vt 0.703704 0.225000 +vt 0.703704 0.325000 +vt 0.425926 0.800000 +vt 0.435185 0.825000 +vt 0.425926 0.825000 +vt 0.398148 0.787500 +vt 0.388889 0.800000 +vt 0.388889 0.787500 +vt 0.398148 0.712500 +vt 0.407407 0.800000 +vt 0.416667 0.825000 +vt 0.407407 0.825000 +vt 0.425926 0.787500 +vt 0.435185 0.800000 +vt 0.407407 0.787500 +vt 0.444444 0.800000 +vt 0.435185 0.787500 +vt 0.407407 0.712500 +vt 0.416667 0.787500 +vt 0.398148 0.850000 +vt 0.398148 0.825000 +vt 0.416667 0.800000 +vt 0.416667 0.712500 +vt 0.397836 0.706250 +vt 0.391360 0.711298 +vt 0.391360 0.701202 +vt 0.388889 0.825000 +vt 0.435185 0.712500 +vt 0.398148 0.800000 +vt 0.444444 0.787500 +vt 0.390314 0.856394 +vt 0.398148 0.850287 +vt 0.405982 0.856394 +vt 0.416667 0.850000 +vt 0.444444 0.825000 +vt 0.435185 0.850000 +vt 0.388889 0.850000 +vt 0.407407 0.850000 +vt 0.425926 0.850000 +vt 0.425926 0.800000 +vt 0.435185 0.825000 +vt 0.425926 0.825000 +vt 0.398148 0.787500 +vt 0.388889 0.800000 +vt 0.388889 0.787500 +vt 0.388889 0.712500 +vt 0.407407 0.800000 +vt 0.416667 0.825000 +vt 0.407407 0.825000 +vt 0.435185 0.787500 +vt 0.425926 0.787500 +vt 0.407407 0.712500 +vt 0.407407 0.787500 +vt 0.444444 0.800000 +vt 0.435185 0.800000 +vt 0.444444 0.787500 +vt 0.416667 0.712500 +vt 0.416667 0.787500 +vt 0.398148 0.850000 +vt 0.398148 0.825000 +vt 0.416667 0.800000 +vt 0.389201 0.706250 +vt 0.391360 0.701202 +vt 0.397836 0.706250 +vt 0.398148 0.800000 +vt 0.388889 0.825000 +vt 0.425926 0.712500 +vt 0.435185 0.712500 +vt 0.393625 0.851924 +vt 0.402671 0.851924 +vt 0.402671 0.873076 +vt 0.416667 0.850000 +vt 0.444444 0.850000 +vt 0.435185 0.850000 +vt 0.388889 0.850000 +vt 0.407407 0.850000 +vt 0.425926 0.850000 +vt 0.490741 0.825000 +vt -0.000000 0.325000 +vt 0.444444 0.400000 +vt 0.000000 0.400000 +vt 0.074074 0.800000 +vt 0.444444 0.775000 +vt 0.777778 0.775000 +vt 0.546296 0.900000 +vt 0.055556 0.700000 +vt 0.481481 0.800000 +vt 0.074074 0.700000 +vt 0.018519 0.700000 +vt 0.055556 0.875000 +vt 0.592593 0.850000 +vt 0.629630 0.850000 +vt 0.666667 0.850000 +vt 0.666667 0.837500 +vt 0.685185 0.825000 +vt 0.675926 0.825000 +vt 0.666667 0.837500 +vt 0.962963 0.587500 +vt 0.988471 0.253064 +vt 0.999037 0.287500 +vt 0.988471 0.321936 +vt 0.937455 0.321936 +vt 0.926890 0.287500 +vt 0.926889 0.387500 +vt 0.962963 0.338801 +vt 0.999036 0.387500 +vt 0.988471 0.421936 +vt 0.962963 0.436199 +vt 0.388889 0.712500 +vt 0.425926 0.712500 +vt 0.395677 0.701202 +vt 0.395677 0.711298 +vt 0.389201 0.706250 +vt 0.444444 0.712500 +vt 0.405982 0.868606 +vt 0.398148 0.874712 +vt 0.390314 0.868606 +vt 0.444444 0.850000 +vt 0.398148 0.712500 +vt 0.444444 0.825000 +vt 0.395677 0.701202 +vt 0.395677 0.711298 +vt 0.391360 0.711298 +vt 0.444444 0.712500 +vt 0.407194 0.862500 +vt 0.393625 0.873076 +vt 0.389102 0.862500 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.9923 -0.1240 0.0000 +vn -0.0000 -0.2249 0.9744 +vn 0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.7071 -0.0000 0.7071 +vn 0.7071 -0.0000 -0.7071 +vn -0.9923 -0.1240 0.0000 +vn 0.8740 -0.1093 0.4734 +vn -0.8740 -0.1093 0.4734 +vn 0.0000 -0.1644 -0.9864 +vn -0.7960 -0.0995 -0.5970 +vn 0.7960 -0.0995 -0.5970 +vn -0.0000 -0.7071 0.7071 +vn 0.0000 -0.4472 0.8944 +vn -0.8729 -0.2182 -0.4364 +vn 0.7071 0.7071 0.0000 +vn -0.9701 -0.2425 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.8944 -0.4472 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.3827 0.9239 +vn -0.0000 -0.3827 0.9239 +vn -0.0000 -0.9239 0.3827 +vn -0.0000 -0.9239 -0.3827 +vn -0.0000 -0.3827 -0.9239 +vn 0.9774 -0.2106 0.0204 +vn -0.0000 -0.9954 0.0962 +vn -0.5000 -0.0833 -0.8620 +vn -0.4887 -0.1292 0.8628 +vn 0.4887 -0.2921 -0.8221 +vn -0.5000 0.0833 0.8620 +vn 0.5000 0.0833 0.8620 +vn -0.4887 -0.2921 -0.8221 +vn 0.4887 -0.1292 0.8628 +vn 0.5000 -0.0833 -0.8620 +vn -0.9774 -0.2106 0.0204 +vn 0.0000 0.9954 -0.0962 +vn 0.9774 -0.2087 -0.0348 +vn -0.0000 -0.9864 -0.1646 +vn -0.5000 0.1426 -0.8542 +vn -0.4887 -0.3481 0.8000 +vn 0.4887 -0.0694 -0.8697 +vn -0.5000 -0.1426 0.8542 +vn 0.5000 -0.1426 0.8542 +vn -0.4887 -0.0694 -0.8697 +vn 0.4887 -0.3481 0.8000 +vn 0.5000 0.1426 -0.8542 +vn -0.9774 -0.2087 -0.0348 +vn 0.0000 0.9864 0.1646 +vn -0.8729 -0.2182 0.4364 +s off +f 201/329/85 206/330/85 202/331/85 +f 198/332/86 200/333/86 197/334/86 +f 195/335/87 200/333/87 196/336/87 +f 194/337/85 198/332/85 193/338/85 +f 220/339/88 223/340/88 219/341/88 +f 219/342/89 221/343/89 217/344/89 +f 204/345/87 207/346/87 203/347/87 +f 208/348/90 205/349/90 207/346/90 +f 202/350/85 209/351/85 194/352/85 +f 196/353/87 212/354/87 204/355/87 +f 193/356/85 215/357/85 201/358/85 +f 203/359/87 214/360/87 195/361/87 +f 215/357/91 214/360/91 216/362/91 +f 209/351/92 212/354/92 210/363/92 +f 209/351/93 200/333/93 199/364/93 +f 194/337/85 209/365/85 199/364/85 +f 196/336/87 200/333/87 210/366/87 +f 204/355/87 212/354/87 208/367/87 +f 208/368/94 211/369/94 206/370/94 +f 202/350/85 206/371/85 211/369/85 +f 203/347/87 207/346/87 216/372/87 +f 215/357/95 207/346/95 205/349/95 +f 201/329/85 215/373/85 205/349/85 +f 195/361/87 214/360/87 197/374/87 +f 197/334/96 213/375/96 198/332/96 +f 193/356/85 198/376/85 213/375/85 +f 217/377/97 226/378/97 218/379/97 +f 219/342/98 223/340/98 222/380/98 +f 217/344/99 221/343/99 225/381/99 +f 218/382/100 229/383/100 227/384/100 +f 220/385/100 231/386/100 230/387/100 +f 218/379/101 226/378/101 228/388/101 +f 220/339/102 230/387/102 224/389/102 +f 232/390/90 192/391/90 189/392/90 +f 190/393/91 232/390/91 189/392/91 +f 191/394/86 233/395/86 190/393/86 +f 192/396/92 234/397/92 191/394/92 +f 189/398/85 191/394/85 190/393/85 +f 238/399/86 237/400/86 236/401/86 +f 238/402/85 241/403/85 239/404/85 +f 245/405/92 237/406/92 239/407/92 +f 244/408/87 236/409/87 237/410/87 +f 244/408/90 242/411/90 243/412/90 +f 240/413/103 245/405/103 241/403/103 +f 242/411/91 240/414/91 238/399/91 +f 262/415/91 266/416/91 263/417/91 +f 268/418/104 273/419/104 272/420/104 +f 267/421/105 265/422/105 277/423/105 +f 249/424/85 251/425/85 253/426/85 +f 256/427/86 258/428/86 257/429/86 +f 252/430/106 247/431/106 248/432/106 +f 254/433/91 259/434/91 256/427/91 +f 251/435/90 247/431/90 250/436/90 +f 254/433/90 260/437/90 261/438/90 +f 266/416/85 268/439/85 267/440/85 +f 257/441/92 260/437/92 255/442/92 +f 248/432/86 253/443/86 252/444/86 +f 246/445/91 248/432/91 247/431/91 +f 264/446/87 263/417/87 265/422/87 +f 265/422/107 268/447/107 264/446/107 +f 270/448/90 273/419/90 271/449/90 +f 262/415/87 270/450/87 271/449/87 +f 262/415/91 273/419/91 269/451/91 +f 264/446/94 272/452/94 270/453/94 +f 274/454/86 277/455/86 275/456/86 +f 267/457/108 276/458/108 266/459/108 +f 263/417/87 275/460/87 265/422/87 +f 263/417/91 276/458/91 274/454/91 +f 280/461/92 278/462/92 279/463/92 +f 296/464/85 294/465/85 295/466/85 +f 279/463/90 284/467/90 285/468/90 +f 280/461/86 282/469/86 281/470/86 +f 279/463/109 283/471/109 280/461/109 +f 281/470/85 284/472/85 278/462/85 +f 292/473/85 290/474/85 291/475/85 +f 288/476/86 293/477/86 289/478/86 +f 287/479/90 291/480/90 286/481/90 +f 289/478/92 292/473/92 287/479/92 +f 286/482/91 290/483/91 288/476/91 +f 298/484/87 300/485/87 299/486/87 +f 300/485/92 297/487/92 296/464/92 +f 298/488/91 295/489/91 294/490/91 +f 297/487/86 298/488/86 294/490/86 +f 299/491/90 296/464/90 295/492/90 +f 308/493/91 310/494/91 306/495/91 +f 304/496/91 306/495/91 302/497/91 +f 305/498/87 308/499/87 304/500/87 +f 305/498/92 307/501/92 309/502/92 +f 302/497/110 307/501/110 303/503/110 +f 312/504/90 311/505/90 310/494/90 +f 309/502/111 312/506/111 308/499/111 +f 309/502/92 311/505/92 313/507/92 +f 306/495/110 311/505/110 307/501/110 +f 320/508/91 322/509/91 324/510/91 +f 316/511/91 318/512/91 320/508/91 +f 316/511/87 321/513/87 317/514/87 +f 317/515/92 319/516/92 315/517/92 +f 315/517/112 318/512/112 314/518/112 +f 323/519/86 324/520/86 322/509/86 +f 320/508/113 325/521/113 321/513/113 +f 321/522/92 323/519/92 319/516/92 +f 318/512/112 323/519/112 322/509/112 +f 326/523/114 329/524/114 328/525/114 +f 328/525/115 331/526/115 330/527/115 +f 331/528/116 332/529/116 330/530/116 +f 333/531/117 334/532/117 332/529/117 +f 335/533/118 336/534/118 334/532/118 +f 337/535/119 338/536/119 336/534/119 +f 333/537/92 331/538/92 339/539/92 +f 338/536/120 341/540/120 340/541/120 +f 340/541/121 327/542/121 326/523/121 +f 340/543/91 328/544/91 332/545/91 +f 348/546/90 346/547/90 347/548/90 +f 344/549/85 349/550/85 345/551/85 +f 343/552/87 347/548/87 342/553/87 +f 345/554/92 348/546/92 343/555/92 +f 342/556/91 346/547/91 344/557/91 +f 366/558/122 368/559/122 370/560/122 +f 354/561/123 351/562/123 352/563/123 +f 352/563/124 355/564/124 354/561/124 +f 364/565/125 371/566/125 372/567/125 +f 360/568/123 367/569/123 366/558/123 +f 355/564/92 356/570/92 354/561/92 +f 351/571/126 368/559/126 367/569/126 +f 362/572/123 351/571/123 367/569/123 +f 357/573/127 358/574/127 356/570/127 +f 372/567/92 379/575/92 373/576/92 +f 360/568/123 365/577/123 358/574/123 +f 359/578/128 360/568/128 358/574/128 +f 353/579/123 361/580/123 357/581/123 +f 351/562/129 373/576/129 369/582/129 +f 360/568/91 363/583/91 362/572/91 +f 366/558/130 371/566/130 365/577/130 +f 354/561/123 364/565/123 350/584/123 +f 363/583/131 352/585/131 362/572/131 +f 356/570/123 365/577/123 364/565/123 +f 364/565/132 373/576/132 350/584/132 +f 377/586/133 376/587/133 374/588/133 +f 370/560/128 377/589/128 371/566/128 +f 369/590/131 374/591/131 368/559/131 +f 369/582/124 379/575/124 375/592/124 +f 371/566/127 378/593/127 372/567/127 +f 370/560/91 374/591/91 376/594/91 +f 396/595/134 398/596/134 400/597/134 +f 384/598/135 381/599/135 382/600/135 +f 383/601/136 384/598/136 382/600/136 +f 394/602/137 401/603/137 402/604/137 +f 392/605/135 396/595/135 390/606/135 +f 384/598/92 387/607/92 386/608/92 +f 381/609/138 398/596/138 397/610/138 +f 382/611/135 397/610/135 392/605/135 +f 386/608/139 389/612/139 388/613/139 +f 402/604/92 409/614/92 403/615/92 +f 390/606/135 395/616/135 388/613/135 +f 389/612/140 390/606/140 388/613/140 +f 389/617/135 387/618/135 383/619/135 +f 380/620/141 399/621/141 381/599/141 +f 391/622/91 392/605/91 390/606/91 +f 395/616/142 400/597/142 401/603/142 +f 384/598/135 394/602/135 380/620/135 +f 393/623/143 382/611/143 392/605/143 +f 386/608/135 395/616/135 394/602/135 +f 380/620/144 402/604/144 403/615/144 +f 406/624/145 404/625/145 409/626/145 +f 400/597/140 407/627/140 401/603/140 +f 398/596/143 405/628/143 404/629/143 +f 399/621/136 409/614/136 405/630/136 +f 401/603/139 408/631/139 402/604/139 +f 398/596/91 406/632/91 400/597/91 +f 272/452/146 264/446/146 268/447/146 +f 277/423/93 265/422/93 275/633/93 +f 201/329/85 205/349/85 206/330/85 +f 198/332/86 199/364/86 200/333/86 +f 195/335/87 197/334/87 200/333/87 +f 194/337/85 199/364/85 198/332/85 +f 220/339/88 224/389/88 223/340/88 +f 219/342/89 222/380/89 221/343/89 +f 204/345/87 208/348/87 207/346/87 +f 208/348/90 206/330/90 205/349/90 +f 202/350/85 211/369/85 209/351/85 +f 196/353/87 210/363/87 212/354/87 +f 193/356/85 213/375/85 215/357/85 +f 203/359/87 216/362/87 214/360/87 +f 215/357/91 213/375/91 214/360/91 +f 209/351/92 211/369/92 212/354/92 +f 209/351/93 210/363/93 200/333/93 +f 208/368/94 212/354/94 211/369/94 +f 215/357/95 216/362/95 207/346/95 +f 197/334/96 214/360/96 213/375/96 +f 217/377/97 225/381/97 226/378/97 +f 218/382/100 228/388/100 229/383/100 +f 220/385/100 227/634/100 231/386/100 +f 232/390/90 235/635/90 192/391/90 +f 190/393/91 233/395/91 232/390/91 +f 191/394/86 234/397/86 233/395/86 +f 192/396/92 235/636/92 234/397/92 +f 189/398/85 192/637/85 191/394/85 +f 238/399/86 239/638/86 237/400/86 +f 238/402/85 240/413/85 241/403/85 +f 239/407/92 241/639/92 245/405/92 +f 245/405/92 244/408/92 237/406/92 +f 244/408/87 243/412/87 236/409/87 +f 244/408/90 245/405/90 242/411/90 +f 240/413/103 242/411/103 245/405/103 +f 238/399/91 236/401/91 242/411/91 +f 236/401/91 243/412/91 242/411/91 +f 262/415/91 269/451/91 266/416/91 +f 268/418/104 269/640/104 273/419/104 +f 249/424/85 246/445/85 251/425/85 +f 256/427/86 259/434/86 258/428/86 +f 252/430/106 250/641/106 247/431/106 +f 254/433/91 261/438/91 259/434/91 +f 251/435/90 246/445/90 247/431/90 +f 254/433/90 255/442/90 260/437/90 +f 266/416/85 269/451/85 268/439/85 +f 257/441/92 258/642/92 260/437/92 +f 248/432/86 249/424/86 253/443/86 +f 246/445/91 249/424/91 248/432/91 +f 264/446/87 262/415/87 263/417/87 +f 265/422/107 267/421/107 268/447/107 +f 270/448/90 272/420/90 273/419/90 +f 262/415/87 264/446/87 270/450/87 +f 262/415/91 271/449/91 273/419/91 +f 274/454/86 276/458/86 277/455/86 +f 267/457/108 277/455/108 276/458/108 +f 263/417/87 274/454/87 275/460/87 +f 263/417/91 266/416/91 276/458/91 +f 280/461/92 281/470/92 278/462/92 +f 296/464/85 297/487/85 294/465/85 +f 279/463/90 278/462/90 284/467/90 +f 280/461/86 283/643/86 282/469/86 +f 279/463/109 285/644/109 283/471/109 +f 281/470/85 282/645/85 284/472/85 +f 292/473/85 293/477/85 290/474/85 +f 288/476/86 290/483/86 293/477/86 +f 287/479/90 292/473/90 291/480/90 +f 289/478/92 293/477/92 292/473/92 +f 286/482/91 291/646/91 290/483/91 +f 298/484/87 301/647/87 300/485/87 +f 300/485/92 301/647/92 297/487/92 +f 298/488/91 299/648/91 295/489/91 +f 297/487/86 301/647/86 298/488/86 +f 299/491/90 300/485/90 296/464/90 +f 308/493/91 312/649/91 310/494/91 +f 304/496/91 308/493/91 306/495/91 +f 305/498/87 309/502/87 308/499/87 +f 305/498/92 303/503/92 307/501/92 +f 302/497/110 306/495/110 307/501/110 +f 312/504/90 313/650/90 311/505/90 +f 309/502/111 313/507/111 312/506/111 +f 309/502/92 307/501/92 311/505/92 +f 306/495/110 310/494/110 311/505/110 +f 320/508/91 318/512/91 322/509/91 +f 316/511/91 314/518/91 318/512/91 +f 316/511/87 320/508/87 321/513/87 +f 317/515/92 321/522/92 319/516/92 +f 315/517/112 319/516/112 318/512/112 +f 323/519/86 325/651/86 324/520/86 +f 320/508/113 324/510/113 325/521/113 +f 321/522/92 325/652/92 323/519/92 +f 318/512/112 319/516/112 323/519/112 +f 326/523/114 327/542/114 329/524/114 +f 328/525/115 329/524/115 331/526/115 +f 331/528/116 333/531/116 332/529/116 +f 333/531/117 335/533/117 334/532/117 +f 335/533/118 337/535/118 336/534/118 +f 337/535/119 339/653/119 338/536/119 +f 331/538/92 329/654/92 339/539/92 +f 329/654/92 327/655/92 339/539/92 +f 327/655/92 341/656/92 339/539/92 +f 339/539/92 337/657/92 335/658/92 +f 335/658/92 333/537/92 339/539/92 +f 338/536/120 339/653/120 341/540/120 +f 340/541/121 341/540/121 327/542/121 +f 340/543/91 326/659/91 328/544/91 +f 328/544/91 330/660/91 332/545/91 +f 332/545/91 334/661/91 336/662/91 +f 336/662/91 338/663/91 332/545/91 +f 338/663/91 340/543/91 332/545/91 +f 348/546/90 349/550/90 346/547/90 +f 344/549/85 346/547/85 349/550/85 +f 343/552/87 348/546/87 347/548/87 +f 345/554/92 349/550/92 348/546/92 +f 342/556/91 347/548/91 346/547/91 +f 366/558/122 367/569/122 368/559/122 +f 354/561/123 350/584/123 351/562/123 +f 352/563/124 353/664/124 355/564/124 +f 364/565/125 365/577/125 371/566/125 +f 360/568/123 362/572/123 367/569/123 +f 355/564/92 357/573/92 356/570/92 +f 351/571/126 369/590/126 368/559/126 +f 362/572/123 352/585/123 351/571/123 +f 357/573/127 359/578/127 358/574/127 +f 372/567/92 378/593/92 379/575/92 +f 360/568/123 366/558/123 365/577/123 +f 359/578/128 361/665/128 360/568/128 +f 357/581/123 355/666/123 353/579/123 +f 353/579/123 363/667/123 361/580/123 +f 361/580/123 359/668/123 357/581/123 +f 351/562/129 350/584/129 373/576/129 +f 360/568/91 361/665/91 363/583/91 +f 366/558/130 370/560/130 371/566/130 +f 354/561/123 356/570/123 364/565/123 +f 363/583/131 353/669/131 352/585/131 +f 356/570/123 358/574/123 365/577/123 +f 364/565/132 372/567/132 373/576/132 +f 374/588/133 375/670/133 377/586/133 +f 375/670/133 379/671/133 377/586/133 +f 379/671/133 378/672/133 377/586/133 +f 370/560/128 376/594/128 377/589/128 +f 369/590/131 375/673/131 374/591/131 +f 369/582/124 373/576/124 379/575/124 +f 371/566/127 377/589/127 378/593/127 +f 370/560/91 368/559/91 374/591/91 +f 396/595/134 397/610/134 398/596/134 +f 384/598/135 380/620/135 381/599/135 +f 383/601/136 385/674/136 384/598/136 +f 394/602/137 395/616/137 401/603/137 +f 392/605/135 397/610/135 396/595/135 +f 384/598/92 385/674/92 387/607/92 +f 381/609/138 399/675/138 398/596/138 +f 382/611/135 381/609/135 397/610/135 +f 386/608/139 387/607/139 389/612/139 +f 402/604/92 408/631/92 409/614/92 +f 390/606/135 396/595/135 395/616/135 +f 389/612/140 391/622/140 390/606/140 +f 387/618/135 385/676/135 383/619/135 +f 383/619/135 393/677/135 391/678/135 +f 391/678/135 389/617/135 383/619/135 +f 380/620/141 403/615/141 399/621/141 +f 391/622/91 393/623/91 392/605/91 +f 395/616/142 396/595/142 400/597/142 +f 384/598/135 386/608/135 394/602/135 +f 393/623/143 383/679/143 382/611/143 +f 386/608/135 388/613/135 395/616/135 +f 380/620/144 394/602/144 402/604/144 +f 404/625/145 405/680/145 409/626/145 +f 409/626/145 408/681/145 407/682/145 +f 407/682/145 406/624/145 409/626/145 +f 400/597/140 406/632/140 407/627/140 +f 398/596/143 399/675/143 405/628/143 +f 399/621/136 403/615/136 409/614/136 +f 401/603/139 407/627/139 408/631/139 +f 398/596/91 404/629/91 406/632/91 diff --git a/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj b/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj new file mode 100644 index 000000000..8b874c6c3 --- /dev/null +++ b/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj @@ -0,0 +1,330 @@ +# Blender v2.79 (sub 0) OBJ File: 'skeleton_holder.blend' +# www.blender.org +o Holder1 +v -0.007506 0.185094 0.287769 +v -0.369728 0.834613 0.384826 +v -0.039858 0.185094 0.167028 +v -0.402080 0.834613 0.264085 +v 0.097059 0.247594 0.259751 +v -0.265163 0.897113 0.356808 +v 0.064706 0.247594 0.139010 +v -0.297516 0.897113 0.236067 +v 0.365620 0.000000 -0.258745 +v -0.358824 0.000000 -0.064630 +v 0.333268 0.000000 -0.379485 +v -0.391176 0.000000 -0.185371 +v 0.365620 0.125000 -0.258745 +v -0.358824 0.125000 -0.064630 +v 0.333268 0.125000 -0.379485 +v -0.391176 0.125000 -0.185371 +v -0.491581 1.016218 0.267475 +v -0.205884 1.425794 0.242480 +v -0.535159 1.016218 -0.230622 +v -0.249462 1.425794 -0.255617 +v -0.083563 0.729430 0.231779 +v 0.202134 1.139006 0.206783 +v -0.127141 0.729430 -0.266319 +v 0.158556 1.139006 -0.291314 +v -0.491581 1.016218 0.267475 +v -0.205884 1.425794 0.242480 +v -0.535159 1.016218 -0.230622 +v -0.249462 1.425794 -0.255617 +v -0.083563 0.729430 0.231779 +v 0.202134 1.139006 0.206783 +v -0.127141 0.729430 -0.266319 +v 0.158556 1.139006 -0.291314 +v -0.250476 0.114105 0.250000 +v -0.185109 0.861251 0.250000 +v -0.250476 0.114105 -0.250000 +v -0.185109 0.861251 -0.250000 +v -0.499524 0.135894 0.250000 +v -0.434158 0.883040 0.250000 +v -0.499524 0.135894 -0.250000 +v -0.434158 0.883040 -0.250000 +v -0.250476 0.114105 0.250000 +v -0.185109 0.861251 0.250000 +v -0.250476 0.114105 -0.250000 +v -0.185109 0.861251 -0.250000 +v -0.499524 0.135894 0.250000 +v -0.434158 0.883040 0.250000 +v -0.499524 0.135894 -0.250000 +v -0.434158 0.883040 -0.250000 +v 0.333268 -0.000000 0.379485 +v -0.391176 0.000000 0.185371 +v 0.365620 -0.000000 0.258745 +v -0.358824 0.000000 0.064630 +v 0.333268 0.125000 0.379485 +v -0.391176 0.125000 0.185371 +v 0.365620 0.125000 0.258745 +v -0.358824 0.125000 0.064630 +v -0.039858 0.185094 -0.167028 +v -0.402080 0.834613 -0.264085 +v -0.007506 0.185094 -0.287769 +v -0.369728 0.834613 -0.384826 +v 0.064706 0.247594 -0.139010 +v -0.297516 0.897113 -0.236067 +v 0.097059 0.247594 -0.259751 +v -0.265163 0.897113 -0.356808 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt -0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.031250 0.437500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.093750 0.062500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt 0.031250 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.750000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt -0.000000 0.500000 +vt 0.250000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.250000 0.750000 +vt -0.000000 0.500000 +vt 0.125000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.312500 0.000000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.625000 0.000000 +vt 0.500000 0.375000 +vt 0.312500 0.000000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.437500 0.500000 +vt 0.562500 0.375000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.312500 0.375000 +vt 0.437500 0.375000 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.375000 +vt 0.500000 0.000000 +vt 0.437500 0.000000 +vt 0.500000 0.375000 +vt 0.625000 0.000000 +vt 0.250000 0.375000 +vt 0.312500 0.000000 +vt 0.250000 0.000000 +vt 0.562500 0.375000 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.312500 0.375000 +vt 0.312500 0.500000 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt -0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.031250 0.437500 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.062500 0.437500 +vt 0.062500 0.062500 +vt 0.031250 0.062500 +vt 0.031250 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vt 0.125000 0.437500 +vt -0.000000 0.437500 +vt 0.093750 0.437500 +vt 0.031250 0.500000 +vt 0.500000 0.750000 +vt -0.000000 0.750000 +vt 0.375000 0.750000 +vt 0.125000 1.000000 +vt -0.000000 0.750000 +vt 0.375000 0.750000 +vt 0.125000 1.000000 +vt 0.312500 0.375000 +vt 0.625000 0.375000 +vt 0.437500 0.375000 +vt 0.312500 0.500000 +vt 0.312500 0.375000 +vt 0.625000 0.375000 +vt 0.437500 0.375000 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vt 0.093750 0.437500 +vt -0.000000 0.437500 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vn -0.8365 -0.5000 0.2241 +vn -0.2588 -0.0000 -0.9659 +vn 0.8365 0.5000 -0.2241 +vn 0.2588 0.0000 0.9659 +vn 0.4830 -0.8660 -0.1294 +vn -0.4830 0.8660 0.1294 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.9659 0.0000 -0.2588 +vn -0.9659 0.0000 0.2588 +vn -0.8160 0.5736 0.0714 +vn -0.0872 -0.0000 -0.9962 +vn 0.8160 -0.5736 -0.0714 +vn 0.0872 0.0000 0.9962 +vn -0.5714 -0.8192 0.0500 +vn 0.5714 0.8192 -0.0500 +vn 0.9962 -0.0872 0.0000 +vn 0.0000 -0.0000 -1.0000 +vn -0.9962 0.0872 0.0000 +vn -0.0000 0.0000 1.0000 +vn -0.0872 -0.9962 0.0000 +vn 0.0872 0.9962 0.0000 +vn 0.2588 0.0000 -0.9659 +vn -0.2588 0.0000 0.9659 +vn 0.9659 0.0000 0.2588 +vn -0.9659 0.0000 -0.2588 +vn -0.8365 -0.5000 -0.2241 +vn 0.8365 0.5000 0.2241 +vn 0.4830 -0.8660 0.1294 +vn -0.4830 0.8660 -0.1294 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/2/2 +f 8/6/3 5/7/3 7/5/3 +f 5/7/4 2/8/4 1/9/4 +f 3/10/5 5/11/5 1/12/5 +f 4/13/6 6/14/6 8/6/6 +f 9/15/7 12/16/7 11/17/7 +f 12/16/2 15/18/2 11/17/2 +f 16/19/8 13/20/8 15/18/8 +f 14/21/4 9/22/4 13/20/4 +f 15/23/9 9/24/9 11/25/9 +f 12/26/10 14/21/10 16/19/10 +f 17/27/11 20/28/11 19/29/11 +f 20/28/12 23/30/12 19/29/12 +f 24/31/13 21/32/13 23/30/13 +f 22/33/14 17/34/14 21/32/14 +f 23/35/15 17/36/15 19/37/15 +f 20/38/16 22/33/16 24/31/16 +f 25/39/13 28/40/13 26/41/13 +f 31/42/14 28/40/14 27/43/14 +f 29/44/11 32/45/11 31/42/11 +f 25/46/12 30/47/12 29/44/12 +f 25/48/16 31/49/16 27/50/16 +f 30/47/15 28/51/15 32/45/15 +f 35/52/17 34/53/17 33/54/17 +f 39/55/18 36/56/18 35/57/18 +f 37/58/19 40/59/19 39/55/19 +f 33/60/20 38/61/20 37/62/20 +f 33/63/21 39/64/21 35/65/21 +f 40/66/22 34/67/22 36/56/22 +f 42/68/19 43/69/19 41/70/19 +f 44/71/20 47/72/20 43/73/20 +f 48/74/17 45/75/17 47/72/17 +f 46/76/18 41/77/18 45/78/18 +f 47/79/22 41/80/22 43/81/22 +f 48/82/21 42/83/21 46/84/21 +f 50/85/7 51/86/7 49/87/7 +f 52/88/23 55/89/23 51/86/23 +f 56/90/8 53/91/8 55/89/8 +f 53/91/24 50/92/24 49/93/24 +f 51/94/25 53/95/25 49/96/25 +f 52/97/26 54/98/26 56/90/26 +f 58/99/27 59/100/27 57/101/27 +f 59/100/23 64/102/23 63/103/23 +f 64/102/28 61/104/28 63/103/28 +f 62/105/24 57/106/24 61/104/24 +f 59/107/29 61/108/29 57/109/29 +f 60/110/30 62/105/30 64/102/30 +f 2/1/1 4/4/1 3/2/1 +f 4/4/2 8/6/2 7/5/2 +f 8/6/3 6/14/3 5/7/3 +f 5/7/4 6/14/4 2/8/4 +f 3/10/5 7/111/5 5/11/5 +f 4/13/6 2/112/6 6/14/6 +f 9/15/7 10/113/7 12/16/7 +f 12/16/2 16/19/2 15/18/2 +f 16/19/8 14/21/8 13/20/8 +f 14/21/4 10/114/4 9/22/4 +f 15/23/9 13/115/9 9/24/9 +f 12/26/10 10/116/10 14/21/10 +f 17/27/11 18/117/11 20/28/11 +f 20/28/12 24/31/12 23/30/12 +f 24/31/13 22/33/13 21/32/13 +f 22/33/14 18/118/14 17/34/14 +f 23/35/15 21/119/15 17/36/15 +f 20/38/16 18/120/16 22/33/16 +f 25/39/13 27/43/13 28/40/13 +f 31/42/14 32/45/14 28/40/14 +f 29/44/11 30/47/11 32/45/11 +f 25/46/12 26/121/12 30/47/12 +f 25/48/16 29/122/16 31/49/16 +f 30/47/15 26/123/15 28/51/15 +f 35/52/17 36/124/17 34/53/17 +f 39/55/18 40/59/18 36/56/18 +f 37/58/19 38/125/19 40/59/19 +f 33/60/20 34/67/20 38/61/20 +f 33/63/21 37/126/21 39/64/21 +f 40/66/22 38/127/22 34/67/22 +f 42/68/19 44/128/19 43/69/19 +f 44/71/20 48/74/20 47/72/20 +f 48/74/17 46/129/17 45/75/17 +f 46/76/18 42/83/18 41/77/18 +f 47/79/22 45/130/22 41/80/22 +f 48/82/21 44/71/21 42/83/21 +f 50/85/7 52/88/7 51/86/7 +f 52/88/23 56/90/23 55/89/23 +f 56/90/8 54/98/8 53/91/8 +f 53/91/24 54/98/24 50/92/24 +f 51/94/25 55/131/25 53/95/25 +f 52/97/26 50/132/26 54/98/26 +f 58/99/27 60/133/27 59/100/27 +f 59/100/23 60/133/23 64/102/23 +f 64/102/28 62/105/28 61/104/28 +f 62/105/24 58/134/24 57/106/24 +f 59/107/29 63/135/29 61/108/29 +f 60/110/30 58/136/30 62/105/30 diff --git a/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt b/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt new file mode 100644 index 000000000..221919653 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt differ diff --git a/src/main/resources/assets/hbm/structures/beached_patrol.nbt b/src/main/resources/assets/hbm/structures/beached_patrol.nbt new file mode 100644 index 000000000..417f3bd8e Binary files /dev/null and b/src/main/resources/assets/hbm/structures/beached_patrol.nbt differ diff --git a/src/main/resources/assets/hbm/structures/oil_rig.nbt b/src/main/resources/assets/hbm/structures/oil_rig.nbt new file mode 100644 index 000000000..841f65cde Binary files /dev/null and b/src/main/resources/assets/hbm/structures/oil_rig.nbt differ diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_arm.png b/src/main/resources/assets/hbm/textures/armor/taurun_arm.png new file mode 100644 index 000000000..121b5cae3 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/armor/taurun_arm.png differ diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_chest.png b/src/main/resources/assets/hbm/textures/armor/taurun_chest.png new file mode 100644 index 000000000..696b0e7a7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/armor/taurun_chest.png differ diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_helmet.png b/src/main/resources/assets/hbm/textures/armor/taurun_helmet.png new file mode 100644 index 000000000..656f40f8b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/armor/taurun_helmet.png differ diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_leg.png b/src/main/resources/assets/hbm/textures/armor/taurun_leg.png new file mode 100644 index 000000000..c5e595eeb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/armor/taurun_leg.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png b/src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png new file mode 100644 index 000000000..66c1990fc Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_buff.png b/src/main/resources/assets/hbm/textures/entity/siege_buff.png deleted file mode 100644 index f95ba419a..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_buff.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_clay.png b/src/main/resources/assets/hbm/textures/entity/siege_clay.png deleted file mode 100644 index cf5ccb8ed..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_clay.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_desh.png b/src/main/resources/assets/hbm/textures/entity/siege_desh.png deleted file mode 100644 index 21e5cea37..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_desh.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_dnt.png b/src/main/resources/assets/hbm/textures/entity/siege_dnt.png deleted file mode 100644 index 3886788d5..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_dnt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png deleted file mode 100644 index bf5c5145c..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png deleted file mode 100644 index a62854104..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_desh.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_desh.png deleted file mode 100644 index 29386e3fb..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_desh.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_dnt.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_dnt.png deleted file mode 100644 index 922fcf854..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_dnt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_gold.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_gold.png deleted file mode 100644 index 767ae055b..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_gold.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png deleted file mode 100644 index 72ac3298e..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_schrab.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_schrab.png deleted file mode 100644 index 5bf4346b8..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_schrab.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png deleted file mode 100644 index 8584831ca..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png deleted file mode 100644 index 4cd317e2d..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_gold.png b/src/main/resources/assets/hbm/textures/entity/siege_gold.png deleted file mode 100644 index 3a21166ce..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_gold.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_iron.png b/src/main/resources/assets/hbm/textures/entity/siege_iron.png deleted file mode 100644 index dfaa2333c..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_iron.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_schrab.png b/src/main/resources/assets/hbm/textures/entity/siege_schrab.png deleted file mode 100644 index f92e5e2b9..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_schrab.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_silver.png b/src/main/resources/assets/hbm/textures/entity/siege_silver.png deleted file mode 100644 index 1be7bb6fa..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_silver.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_stone.png b/src/main/resources/assets/hbm/textures/entity/siege_stone.png deleted file mode 100644 index eae23ffbb..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/siege_stone.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_buff.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_buff.png deleted file mode 100644 index f2d6b27cb..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_buff.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png deleted file mode 100644 index f9736160b..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png deleted file mode 100644 index ae7851cec..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png deleted file mode 100644 index 5ddd978cb..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_gold.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_gold.png deleted file mode 100644 index 39d9164de..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_gold.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png deleted file mode 100644 index 52c1584b5..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png deleted file mode 100644 index 5fc11f60a..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png deleted file mode 100644 index b35162465..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_stone.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_stone.png deleted file mode 100644 index 0da005db9..000000000 Binary files a/src/main/resources/assets/hbm/textures/entity/ufo_siege_stone.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/assembly_template_alt.png b/src/main/resources/assets/hbm/textures/items/assembly_template_alt.png deleted file mode 100644 index 2537c2fc2..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/assembly_template_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ducttape.png b/src/main/resources/assets/hbm/textures/items/ducttape.png index facce7f8e..dca05429a 100644 Binary files a/src/main/resources/assets/hbm/textures/items/ducttape.png and b/src/main/resources/assets/hbm/textures/items/ducttape.png differ diff --git a/src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png b/src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png new file mode 100644 index 000000000..dc8901a93 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_1.png b/src/main/resources/assets/hbm/textures/items/ln2_1.png deleted file mode 100644 index afdd4453c..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_1.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_10.png b/src/main/resources/assets/hbm/textures/items/ln2_10.png deleted file mode 100644 index d6e6b40a7..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_10.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_2.png b/src/main/resources/assets/hbm/textures/items/ln2_2.png deleted file mode 100644 index af7187803..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_2.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_3.png b/src/main/resources/assets/hbm/textures/items/ln2_3.png deleted file mode 100644 index 55b04d07a..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_3.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_4.png b/src/main/resources/assets/hbm/textures/items/ln2_4.png deleted file mode 100644 index f33742080..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_4.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_5.png b/src/main/resources/assets/hbm/textures/items/ln2_5.png deleted file mode 100644 index 20e0fcefd..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_5.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_6.png b/src/main/resources/assets/hbm/textures/items/ln2_6.png deleted file mode 100644 index 41256391a..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_6.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_7.png b/src/main/resources/assets/hbm/textures/items/ln2_7.png deleted file mode 100644 index bd3a7ba0f..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_7.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_8.png b/src/main/resources/assets/hbm/textures/items/ln2_8.png deleted file mode 100644 index 18195c822..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_8.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ln2_9.png b/src/main/resources/assets/hbm/textures/items/ln2_9.png deleted file mode 100644 index 8cc282346..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ln2_9.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/magnet_circular.png b/src/main/resources/assets/hbm/textures/items/magnet_circular.png deleted file mode 100644 index 4d8f16620..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/magnet_circular.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/magnet_dee.png b/src/main/resources/assets/hbm/textures/items/magnet_dee.png deleted file mode 100644 index 8815f2837..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/magnet_dee.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/magnetron.png b/src/main/resources/assets/hbm/textures/items/magnetron.png deleted file mode 100644 index 5f160f01f..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/magnetron.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_daffergon.png b/src/main/resources/assets/hbm/textures/items/nugget_daffergon.png deleted file mode 100644 index 6e8922ebb..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_daffergon.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_reiium.png b/src/main/resources/assets/hbm/textures/items/nugget_reiium.png deleted file mode 100644 index b6b8a5d3f..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_reiium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_u238m2.png b/src/main/resources/assets/hbm/textures/items/nugget_u238m2.png deleted file mode 100644 index 95a04822b..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_u238m2.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_unobtainium.png b/src/main/resources/assets/hbm/textures/items/nugget_unobtainium.png deleted file mode 100644 index a4aa40b77..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_unobtainium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_verticium.png b/src/main/resources/assets/hbm/textures/items/nugget_verticium.png deleted file mode 100644 index c8f9333ec..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_verticium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/nugget_weidanium.png b/src/main/resources/assets/hbm/textures/items/nugget_weidanium.png deleted file mode 100644 index 86ad834db..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/nugget_weidanium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pellets_canister.png b/src/main/resources/assets/hbm/textures/items/pellets_canister.png deleted file mode 100644 index a443f38c3..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pellets_canister.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png b/src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png deleted file mode 100644 index 6a5489d55..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pellets_claws.png b/src/main/resources/assets/hbm/textures/items/pellets_claws.png deleted file mode 100644 index 00dd97af9..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pellets_claws.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pellets_flechette.png b/src/main/resources/assets/hbm/textures/items/pellets_flechette.png deleted file mode 100644 index b0711e2ac..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pellets_flechette.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pill_salt.png b/src/main/resources/assets/hbm/textures/items/pill_salt.png deleted file mode 100644 index decab9dba..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pill_salt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pill_zinc.png b/src/main/resources/assets/hbm/textures/items/pill_zinc.png deleted file mode 100644 index d93286d73..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pill_zinc.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/pipe_lead.png b/src/main/resources/assets/hbm/textures/items/pipe_lead.png index 830e00f3c..57e6c10a9 100644 Binary files a/src/main/resources/assets/hbm/textures/items/pipe_lead.png and b/src/main/resources/assets/hbm/textures/items/pipe_lead.png differ diff --git a/src/main/resources/assets/hbm/textures/items/pirfenidone.png b/src/main/resources/assets/hbm/textures/items/pirfenidone.png deleted file mode 100644 index 9ab831d0f..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/pirfenidone.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_daffergon.png b/src/main/resources/assets/hbm/textures/items/powder_daffergon.png deleted file mode 100644 index f9afea212..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/powder_daffergon.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_reiium.png b/src/main/resources/assets/hbm/textures/items/powder_reiium.png deleted file mode 100644 index 52bd800c8..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/powder_reiium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_unobtainium.png b/src/main/resources/assets/hbm/textures/items/powder_unobtainium.png deleted file mode 100644 index 2f26e8148..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/powder_unobtainium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_verticium.png b/src/main/resources/assets/hbm/textures/items/powder_verticium.png deleted file mode 100644 index 5346e7b44..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/powder_verticium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/powder_weidanium.png b/src/main/resources/assets/hbm/textures/items/powder_weidanium.png deleted file mode 100644 index cc7c044d1..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/powder_weidanium.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png b/src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png deleted file mode 100644 index ebdca2cc5..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/singularity_2.png b/src/main/resources/assets/hbm/textures/items/singularity_2.png deleted file mode 100644 index be5b273d3..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/singularity_2.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/singularity_3.png b/src/main/resources/assets/hbm/textures/items/singularity_3.png deleted file mode 100644 index a171074f1..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/singularity_3.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/singularity_micro.png b/src/main/resources/assets/hbm/textures/items/singularity_micro.png deleted file mode 100644 index b1c9e4765..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/singularity_micro.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/singularity_spark.png b/src/main/resources/assets/hbm/textures/items/singularity_spark.png deleted file mode 100644 index c2e97f9a6..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/singularity_spark.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/singularity_special.png b/src/main/resources/assets/hbm/textures/items/singularity_special.png deleted file mode 100644 index 423f4544c..000000000 Binary files a/src/main/resources/assets/hbm/textures/items/singularity_special.png and /dev/null differ diff --git a/src/main/resources/assets/hbm/textures/items/taurun_boots.png b/src/main/resources/assets/hbm/textures/items/taurun_boots.png new file mode 100644 index 000000000..228a5ca81 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/taurun_boots.png differ diff --git a/src/main/resources/assets/hbm/textures/items/taurun_helmet.png b/src/main/resources/assets/hbm/textures/items/taurun_helmet.png new file mode 100644 index 000000000..9c33872ac Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/taurun_helmet.png differ diff --git a/src/main/resources/assets/hbm/textures/items/taurun_legs.png b/src/main/resources/assets/hbm/textures/items/taurun_legs.png new file mode 100644 index 000000000..0be64f1d7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/taurun_legs.png differ diff --git a/src/main/resources/assets/hbm/textures/items/taurun_plate.png b/src/main/resources/assets/hbm/textures/items/taurun_plate.png new file mode 100644 index 000000000..a235a28f8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/taurun_plate.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png index 0a9ac0043..be0625b8f 100644 Binary files a/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png and b/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png new file mode 100644 index 000000000..bfb5e4355 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png differ diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png new file mode 100644 index 000000000..9866eb14f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png differ diff --git a/src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png b/src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png new file mode 100644 index 000000000..5b404a064 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png differ