From 3db1dbd277f28c7d2629e35ce9e7739d1cab0d62 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 01/45] the gob block --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 + .../hbm/blocks/generic/BlockWandSpawner.java | 249 ++++++++++++++++++ .../hbm/blocks/generic/DungeonSpawner.java | 106 ++------ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ModEventHandler.java | 140 ++-------- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ++++++++++++++ .../world/gen/util/DungeonSpawnerActions.java | 165 ++++++++++++ .../gen/util/DungeonSpawnerConditions.java | 91 +++++++ src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/blocks/wand_spawner.png | Bin 0 -> 730 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 0 -> 740 bytes 12 files changed, 760 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java create mode 100644 src/main/java/com/hbm/util/MobUtil.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 7ecdc698a..e60125d93 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1240,6 +1240,7 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; + public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2390,6 +2391,8 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); + wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + } private static void registerBlock() { @@ -3534,6 +3537,7 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); + register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java new file mode 100644 index 000000000..fdfca7689 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -0,0 +1,249 @@ +package com.hbm.blocks.generic; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandSpawner() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @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, 3, 2); + if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityWandSpawner) + ((TileEntityWandSpawner)te).placedRotation = i; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return false; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + switch(tool) { + case SCREWDRIVER: + List actionNames = DungeonSpawnerActions.getActionNames(); + int indexA = actionNames.indexOf(spawner.actionID); + + indexA += player.isSneaking() ? -1 : 1; + indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); + + spawner.actionID = actionNames.get(indexA); + return true; + case DEFUSER: + List conditionNames = DungeonSpawnerConditions.getConditionNames(); + int indexC = conditionNames.indexOf(spawner.conditionID); + + indexC += player.isSneaking() ? -1 : 1; + indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); + + spawner.conditionID = conditionNames.get(indexC); + + return true; + + default: return false; + } + } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + List text = new ArrayList(); + text.add("Action: " + spawner.actionID); + text.add("Condition: " + spawner.conditionID); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); + list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityWandSpawner(); + } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return null; + + ((TileEntityWandSpawner) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + + public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + private boolean triggerReplace; + + public int placedRotation; + + public String actionID = "PHASE_ABERRATOR"; + public String conditionID = "ABERRATOR"; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + return; + } + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { + MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + worldObj.setTileEntity(xCoord, yCoord, zCoord, te); + } + + if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ + DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; + spawner.actionID = actionID; + spawner.conditionID = conditionID; + } + + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + nbt.setInteger("rotation", placedRotation); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + placedRotation = nbt.getInteger("rotation"); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(placedRotation); + BufferUtil.writeString(buf, actionID); + BufferUtil.writeString(buf, conditionID); + } + + @Override + public void deserialize(ByteBuf buf) { + placedRotation = buf.readInt(); + actionID = BufferUtil.readString(buf); + conditionID = BufferUtil.readString(buf); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 4a6fc10d8..ffbb14239 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,7 +7,8 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.EnumUtil; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; import net.minecraft.block.BlockContainer; @@ -30,19 +31,35 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - + public static class TileEntityDungeonSpawner extends TileEntity { - + public int phase = 0; public int timer = 0; - public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; - + + public String conditionID = "ABERRATOR"; + //actions always get called before conditions, use the phase timer in order to control behavior via condition + public String actionID = "ABERRATOR"; + + public Function condition; + public Consumer action; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - type.phase.accept(this); - if(type.phaseCondition.apply(this)) { + if(action == null){ + action = DungeonSpawnerActions.actions.get(actionID); + } + if(condition == null){ + condition = DungeonSpawnerConditions.conditions.get(conditionID); + } + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { phase++; timer = 0; } else { @@ -55,83 +72,16 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setByte("type", (byte) type.ordinal()); + nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); + this.conditionID = nbt.getString("conditionID"); } } - - public static enum EnumSpawnerType { - - ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); - public Function phaseCondition; - public Consumer phase; - - private EnumSpawnerType(Function con, Consumer ph) { - this.phaseCondition = con; - this.phase = ph; - } - } - - public static Function CON_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 1 || tile.phase == 2) { - if(tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for(int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for(int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if(mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if(tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if(te instanceof TileEntitySkeletonHolder) { - TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; - if(world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index c4a5a3d4a..9a4cc6040 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,6 +877,8 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); + MobUtil.intializeMobPools(); + proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index cd368b165..655656174 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,74 +387,18 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - - if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine - equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); - return; - } - - slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPools.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPools.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPools.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, - {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} - })); + slotPools = MobUtil.slotPoolCommon; } else if(entity instanceof EntitySkeleton) { - - slotPools.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPools.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPools.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - + slotPools = MobUtil.slotPoolRanged; ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - assignItemsToEntity(entity, slotPools); - } - - private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + MobUtil.assignItemsToEntity(entity, slotPools, rand); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -473,74 +417,30 @@ public class ModEventHandler { return pool; } - - public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - private static ItemStack getSkelegun(float soot, Random rand) { - if(!MobConfig.enableMobWeapons) return null; - if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + if (!MobConfig.enableMobWeapons) return null; + if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList(); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + ArrayList pool = new ArrayList<>(); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); - - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); - - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); - - if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); + if(soot < 0.3){ + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); + pool.add(new WeightedRandomObject(null, 20)); + } else if(soot > 0.3 && soot < 1) { + pool.addAll(MobUtil.slotPoolGuns.get(0.3)); + } else if (soot < 3) { + pool.addAll(MobUtil.slotPoolGuns.get(1D)); + } else if (soot < 5) { + pool.addAll(MobUtil.slotPoolGuns.get(3D)); + } else { + pool.addAll(MobUtil.slotPoolGuns.get(5D)); + } WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } - // these fucking tasks keep stacking on top of themselves - private static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } - @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -549,7 +449,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - addFireTask(living); + MobUtil.addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 20e51d5fc..608ea892e 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,6 +19,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -236,6 +237,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -427,7 +429,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java new file mode 100644 index 000000000..8779c1ed2 --- /dev/null +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -0,0 +1,197 @@ +package com.hbm.util; + +import com.hbm.entity.mob.ai.EntityAIFireGun; +import com.hbm.items.ModItems; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.*; + +public class MobUtil { + + + public static Map> slotPoolCommon = new HashMap<>(); + public static Map> slotPoolRanged = new HashMap<>(); + + public static Map> slotPoolAdv = new HashMap<>(); + public static Map> slotPoolAdvRanged; + /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ + public static HashMap> slotPoolGuns = new HashMap<>(); + + + public static void intializeMobPools(){ + slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, + {ModItems.wrench, 20} + })); + + slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + + slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + })); + slotPoolGuns.put(1D, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} + })); + slotPoolGuns.put(3D, createSlotPool(new Object[][]{ + {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} + })); + slotPoolGuns.put(5D, createSlotPool(new Object[][]{ + {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} + })); + + slotPoolAdv.put(4, createSlotPool(new Object[][]{ + {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, + {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, + {ModItems.hazmat_helmet, 6} + })); + slotPoolAdv.put(3, createSlotPool(new Object[][]{ + {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, + {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, + {ModItems.steel_plate, 8} + })); + slotPoolAdv.put(2, createSlotPool(new Object[][]{ + {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, + {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, + {ModItems.steel_legs, 8} + })); + slotPoolAdv.put(1, createSlotPool(new Object[][]{ + {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, + {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, + {ModItems.robes_boots, 8} + })); + slotPoolAdv.put(0, createSlotPool(new Object[][]{ + {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, + {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, + {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, + {ModItems.wrench, 20} + })); + + slotPoolAdvRanged = new HashMap<>(slotPoolAdv); + slotPoolAdvRanged.remove(0); + + } + + public static List createSlotPool(int nullWeight, Object[][] items) { + List pool = new ArrayList<>(); + pool.add(new WeightedRandomObject(null, nullWeight)); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + public static List createSlotPool(Object[][] items) { + List pool = new ArrayList<>(); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + + public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + } + + public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); + + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } + } + } + + // these fucking tasks keep stacking on top of themselves + public static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java new file mode 100644 index 000000000..120ea00e8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -0,0 +1,165 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.BlockSkeletonHolder; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ItemEnums; +import com.hbm.items.ModItems; +import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.MobUtil; +import com.hbm.util.Vec3NT; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.function.Consumer; + +public class DungeonSpawnerActions { + + public static HashMap> actions = new HashMap<>(); + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1 || tile.phase == 2) { + if (tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for (int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if (mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if (tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; + + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) return; + + //from explosionChaos because i cannot be assed + int r = 4; + int r2 = r * r; + int r22 = r2 / 2; + + for (int xx = -r; xx < r; xx++) { + int X = xx + x; + int XX = xx * xx; + for (int yy = -r; yy < r; yy++) { + int Y = yy + y; + int YY = XX + yy * yy; + for (int zz = -r; zz < r; zz++) { + int Z = zz + z; + int ZZ = YY + zz * zz; + if (ZZ < r22) { + + if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { + EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); + world.spawnEntityInWorld(entityfallingblock); + } + } + } + } + } + world.setBlock(x, y, z, ModBlocks.block_steel); + + }; + + public static Consumer FODDER_WAVE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1) { + Vec3NT vec = new Vec3NT(5, 0, 0); + for (int i = 0; i < 10; i++) { + EntityZombie mob = new EntityZombie(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + if (mob.getCanSpawnHere()) { + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); + } + world.setBlock(x, y, z, ModBlocks.block_steel); + } + }; + + public static Consumer PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 2){ + world.setBlock(x,y,z, ModBlocks.crate_steel); + + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + world.spawnEntityInWorld(blitz); + + TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); + ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); + } + }; + + public static List getActionNames(){ + return new ArrayList<>(actions.keySet()); + } + + //register new actions here + static{ + actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("PUZZLE_TEST", PUZZLE_TEST); + } + + + +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java new file mode 100644 index 000000000..0a634c271 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -0,0 +1,91 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; + +public class DungeonSpawnerConditions { + + public static HashMap> conditions = new HashMap<>(); + + public static Function ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Function PLAYER_CUBE_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); + }; + + public static Function REDSTONE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + return world.isBlockIndirectlyGettingPowered(x,y,z); + }; + + public static Function PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); + world.setBlock(x,y + 1,z, ModBlocks.pedestal); + return true; + } + + TileEntity pedestal = world.getTileEntity(x,y + 1,z); + + return tile.phase == 1 + && pedestal instanceof BlockPedestal.TileEntityPedestal + && ((BlockPedestal.TileEntityPedestal) pedestal).item != null + && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; + }; + + public static List getConditionNames(){ + return new ArrayList<>(conditions.keySet()); + } + + //register new conditions here + static { + conditions.put("ABERRATOR", ABERRATOR); + conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); + conditions.put("REDSTONE", REDSTONE); + conditions.put("PUZZLE_TEST", PUZZLE_TEST); + } + +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 72c0ee93b..924ab3652 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6057,6 +6057,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4788b84883581058c6fdf5525b3239d0e888f352 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flPBx7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`Va7jCRdIWMFVqh|G_VDx+T*Ri*utcI?R3P2J0O%k? Wj>Vsvd|H4;FnGH9xvX Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 02/45] copy tool support and working directional offsets --- .../hbm/blocks/generic/BlockWandSpawner.java | 11 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 4 +++ .../world/gen/util/DungeonSpawnerActions.java | 33 +++++++++++++++++- .../hbm/textures/blocks/wand_spawner_top.png | Bin 740 -> 743 bytes 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index fdfca7689..0508002d7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -33,6 +33,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; @@ -78,9 +79,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + ForgeDirection dir = ForgeDirection.UNKNOWN; + switch(i){ + case 0: dir = ForgeDirection.SOUTH;break; + case 1: dir = ForgeDirection.WEST; break; + case 2: dir = ForgeDirection.NORTH;break; + case 3: dir = ForgeDirection.EAST; break; + } TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = i; + ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } @Override @@ -193,6 +201,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.direction = ForgeDirection.getOrientation(placedRotation); } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index ffbb14239..41fa907b5 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -20,6 +20,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,6 +45,7 @@ public class DungeonSpawner extends BlockContainer { public Function condition; public Consumer action; + public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override public void updateEntity() { @@ -74,6 +76,7 @@ public class DungeonSpawner extends BlockContainer { nbt.setInteger("phase", phase); nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); + nbt.setInteger("direction", direction.ordinal()); } @Override @@ -81,6 +84,7 @@ public class DungeonSpawner extends BlockContainer { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 120ea00e8..1e32d9dc7 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -5,6 +5,7 @@ import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; @@ -12,6 +13,7 @@ import com.hbm.main.ModEventHandler; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -21,7 +23,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.HashMap; @@ -140,7 +145,7 @@ public class DungeonSpawnerActions { if(tile.phase == 2){ world.setBlock(x,y,z, ModBlocks.crate_steel); - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); world.spawnEntityInWorld(blitz); TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); @@ -148,6 +153,31 @@ public class DungeonSpawnerActions { } }; + public static Consumer MISSILE_STRIKE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase != 1) return; + + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); + + ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); + + EntityMissileTier2.EntityMissileStrong missile = + new EntityMissileTier2.EntityMissileStrong( + world, + x + tile.direction.offsetX * 300, + 200, + z + tile.direction.offsetZ * 300, + x + parallel.offsetX * 30 + tile.direction.offsetX * 30, + z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); + WorldUtil.loadAndSpawnEntityInWorld(missile); + + world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -158,6 +188,7 @@ public class DungeonSpawnerActions { actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); + actions.put("MISSILE_STRIKE", MISSILE_STRIKE); } diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png index 4788b84883581058c6fdf5525b3239d0e888f352..65e3106a96f970891be895a960ccfb53a60b3915 100644 GIT binary patch delta 87 zcmaFD`kZyc3?_doPZ!4!iOb0e2?8uk3P&|K*q9Fw delta 84 zcmaFP`h<1E3??6QPZ!4!iOb0e2?8uk3P&|K*q9bP0l+XkK_SqL` From 8bef7d63ddd67cc9e1df266ca3ef5d736d5f991d Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 03/45] disguises for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 65 ++++++++++++++++++- .../hbm/blocks/generic/DungeonSpawner.java | 51 +++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 0508002d7..6d4a6f8a3 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,14 +16,18 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -91,6 +95,30 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityWandSpawner){ + TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; + spawner.disguise = block; + spawner.disguiseMeta = stack.getItemDamage() & 15; + return true; + } + } + } + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); @@ -132,10 +160,17 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - List text = new ArrayList(); + List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + String block; + if(spawner.disguise != null && spawner.disguise != Blocks.air) + block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + else + block = "None"; + + text.add("Disguise Block: " + block); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -167,9 +202,14 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public int placedRotation; + Block disguise; + int disguiseMeta = -1; + public String actionID = "PHASE_ABERRATOR"; public String conditionID = "ABERRATOR"; + public boolean noDisguise; + @Override public void updateEntity() { if(!worldObj.isRemote) { @@ -202,6 +242,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.actionID = actionID; spawner.conditionID = conditionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); + spawner.disguise = disguise; + spawner.disguiseMeta = disguiseMeta; } } @@ -217,6 +259,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); nbt.setInteger("rotation", placedRotation); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } } @Override @@ -225,6 +271,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); placedRotation = nbt.getInteger("rotation"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } @Override @@ -232,6 +282,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + buf.writeInt(Block.getIdFromBlock(disguise)); + buf.writeInt(disguiseMeta); } @Override @@ -239,6 +291,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + disguise = Block.getBlockById(buf.readInt()); + disguiseMeta = buf.readInt(); } @Override @@ -246,6 +300,11 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(disguise != null){ + nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + return nbt; } @@ -253,6 +312,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 41fa907b5..bba6ebfe7 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,18 +7,29 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; +import com.hbm.util.BufferUtil; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; 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.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,11 +44,31 @@ public class DungeonSpawner extends BlockContainer { return new TileEntityDungeonSpawner(); } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityDungeonSpawner){ + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; + if(spawner.disguise != null){ + return spawner.disguise.getIcon(side, spawner.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + + public static class TileEntityDungeonSpawner extends TileEntity { public int phase = 0; public int timer = 0; + public Block disguise; + public int disguiseMeta; + public String conditionID = "ABERRATOR"; //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; @@ -77,6 +108,10 @@ public class DungeonSpawner extends BlockContainer { nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } } @Override @@ -85,6 +120,22 @@ public class DungeonSpawner extends BlockContainer { this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @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()); } } From edd952ec6afd60052410b3d791ee1548c90961d9 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 04/45] Interactions for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 32 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 34 +++++- .../world/gen/util/DungeonSpawnerActions.java | 105 ++++++++++++++---- .../gen/util/DungeonSpawnerConditions.java | 7 +- .../gen/util/DungeonSpawnerInteractions.java | 80 +++++++++++++ 5 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 6d4a6f8a3..b6c042838 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,6 +16,7 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -146,6 +147,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.conditionID = conditionNames.get(indexC); + return true; + case HAND_DRILL: + List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(spawner.interactionID); + + indexI += player.isSneaking() ? -1 : 1; + indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); + + spawner.interactionID = interactionNames.get(indexI); + return true; default: return false; @@ -163,6 +174,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + String block; if(spawner.disguise != null && spawner.disguise != Blocks.air) @@ -171,6 +184,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT block = "None"; text.add("Disguise Block: " + block); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -178,7 +192,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); + list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); } @Override @@ -206,9 +221,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT int disguiseMeta = -1; public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "ABERRATOR"; - - public boolean noDisguise; + public String conditionID = "EMPTY"; + public String interactionID; @Override public void updateEntity() { @@ -241,6 +255,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.interactionID = interactionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); spawner.disguise = disguise; spawner.disguiseMeta = disguiseMeta; @@ -258,6 +273,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.writeToNBT(nbt); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + nbt.setString("interactionID", interactionID); nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); @@ -270,6 +286,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.readFromNBT(nbt); actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); placedRotation = nbt.getInteger("rotation"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); @@ -282,6 +299,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + BufferUtil.writeString(buf, interactionID); buf.writeInt(Block.getIdFromBlock(disguise)); buf.writeInt(disguiseMeta); } @@ -291,6 +309,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + interactionID = BufferUtil.readString(buf); disguise = Block.getBlockById(buf.readInt()); disguiseMeta = buf.readInt(); } @@ -300,8 +319,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); if(disguise != null){ - nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); nbt.setInteger("disguiseMeta", disguiseMeta); } @@ -312,6 +333,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); disguiseMeta = nbt.getInteger("disguiseMeta"); diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index bba6ebfe7..52dbb6099 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -12,6 +12,7 @@ import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -59,22 +60,38 @@ public class DungeonSpawner extends BlockContainer { return super.getIcon(world, x, y, z, side); } + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { + ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } public static class TileEntityDungeonSpawner extends TileEntity { + //phase is incremented per condition check, timer counts since last condition check by default public int phase = 0; public int timer = 0; public Block disguise; public int disguiseMeta; + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ public String conditionID = "ABERRATOR"; - //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; public Function condition; public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override @@ -87,6 +104,10 @@ public class DungeonSpawner extends BlockContainer { if(condition == null){ condition = DungeonSpawnerConditions.conditions.get(conditionID); } + if(interaction == null && interactionID != null){ + interaction = DungeonSpawnerInteractions.interactions.get(interactionID); + } + if(action == null || condition == null){ worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); return; @@ -105,8 +126,12 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + nbt.setInteger("direction", direction.ordinal()); if(disguise != null){ nbt.setInteger("disguiseMeta", disguiseMeta); @@ -118,8 +143,13 @@ public class DungeonSpawner extends BlockContainer { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ disguiseMeta = nbt.getInteger("disguiseMeta"); disguise = Block.getBlockFromName(nbt.getString("disguise")); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 1e32d9dc7..fee835c2e 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -1,7 +1,7 @@ package com.hbm.world.gen.util; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; @@ -9,34 +9,30 @@ import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; -import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.ContaminationUtil; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.function.Consumer; public class DungeonSpawnerActions { - public static HashMap> actions = new HashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -122,14 +118,10 @@ public class DungeonSpawnerActions { Vec3NT vec = new Vec3NT(5, 0, 0); for (int i = 0; i < 10; i++) { EntityZombie mob = new EntityZombie(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - if (mob.getCanSpawnHere()) { - world.spawnEntityInWorld(mob); - break; - } - } + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + world.spawnEntityInWorld(mob); + vec.rotateAroundYDeg(36D); } world.setBlock(x, y, z, ModBlocks.block_steel); @@ -178,6 +170,78 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + ForgeDirection direction = tile.direction.getOpposite(); + ForgeDirection rot = direction.getRotation(ForgeDirection.UP); + + AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); + + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); + + for(EntityLivingBase e : entities) { + + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); + double len = vec.lengthVector(); + vec = vec.normalize(); + + len = Math.max(len,1D); + + float res = 0; + + for(int i = 1; i < len; i++) { + + int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); + int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); + int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); + + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); + } + + if(res < 1) + res = 1; + + float eRads = 100F; + eRads /= (float)res; + eRads /= (float)(len * len); + + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); + } + + if (tile.phase == 2 && tile.timer > 40){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); + + for(int i = 1; i < 20; i++) { + int checkX, checkY, checkZ; + checkX = x + direction.offsetX * i; + checkY = y + 1; + checkZ = z + direction.offsetZ * i; + Block block = world.getBlock(checkX, checkY,checkZ); + TileEntity te = null; + if(block instanceof BlockDummyable){ + int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); + te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); + } + + if (te instanceof TileEntityDoorGeneric) { + TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; + door.setPins(456); + door.close(); + door.lock(); + break; + } + } + + tile.phase = 3; + } + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -189,6 +253,7 @@ public class DungeonSpawnerActions { actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); + actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 0a634c271..83dd773e8 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -15,12 +15,16 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; public class DungeonSpawnerConditions { - public static HashMap> conditions = new HashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); + + /**For use with interactions, for having them handle all conditional tasks*/ + public static Function EMPTY = (tile) -> false; public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -82,6 +86,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); conditions.put("REDSTONE", REDSTONE); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java new file mode 100644 index 000000000..32c19b81d --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java @@ -0,0 +1,80 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.items.ModItems; +import com.hbm.potion.HbmPotion; +import com.hbm.tileentity.TileEntityDoorGeneric; +import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/**Interactions are called when the player right-clicks the block**/ +public class DungeonSpawnerInteractions { + + /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, + * in that order **/ + public static LinkedHashMap> interactions = new LinkedHashMap<>(); + + public static Consumer TEST = (array) -> { + World world = (World) array[0]; + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + int x = (int) array[2]; + int y = (int) array[3]; + int z = (int) array[4]; + EntityPlayer player = (EntityPlayer) array[5]; + int side = (int) array[6]; + + if(spawner.phase > 1) return; + + if(player.getHeldItem() != null) + player.getHeldItem().stackSize--; + + spawner.phase++; + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ + player.getHeldItem().stackSize--; + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Radiation treatment administered")); + player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); + player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); + spawner.phase = 2; + spawner.timer = 0; + } + }; + + + + public static List getInteractionNames(){ + return new ArrayList<>(interactions.keySet()); + } + + //register new interactions here + static{ + interactions.put("TEST", TEST); + interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); + } + + + +} From 360b0acabe66139772dc80678986d0858127bba0 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 05/45] Interactions for the logic block --- src/main/resources/assets/hbm/lang/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d60a76787..1676a79b5 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5277,6 +5277,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain +tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port From 8294df1aa36eb7c58ac8af8454c91607cc7001a7 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Tue, 8 Jul 2025 22:39:15 +0300 Subject: [PATCH 06/45] Extend RBMK crane reach forward Enables close-to-real-life reactor hall replicas, with the storage columns being located further in the reactor hall than the reactor itself --- .../com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 120efd4f5..dca789607 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -275,7 +275,7 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.centerY = y + RBMKDials.getColumnHeight(worldObj) + 1; this.centerZ = z; - this.spanF = 7; + this.spanF = 16; this.spanB = 7; this.spanL = 7; this.spanR = 7; From 097b2bb12c7742ff59d8e453eabc03d9b2f18ae3 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 00:22:59 +0300 Subject: [PATCH 07/45] Fix RBMK crane girder rendering with unequal spans --- .../render/tileentity/RenderCraneConsole.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index f25ef7f0e..8ebf386a9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -22,12 +22,14 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glDisable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_LIGHTING); + int teFacing = 0; switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 2: teFacing = 90; break; + case 4: teFacing = 180; break; + case 3: teFacing = 270; break; + case 5: teFacing = 0; break; } + GL11.glRotatef(teFacing, 0F, 1F, 0F); TileEntityCraneConsole console = (TileEntityCraneConsole) te; @@ -99,12 +101,7 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { double cranePosZ = (-te.zCoord + console.centerZ); GL11.glTranslated(cranePosX, cranePosY, cranePosZ); - switch(te.getBlockMetadata() - BlockDummyable.offset) { - case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; - case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; - case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; - case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; - } + GL11.glRotatef(teFacing, 0F, 1F, 0F); double posX = (console.lastPosFront + (console.posFront - console.lastPosFront) * interp); double posZ = (console.lastPosLeft + (console.posLeft - console.lastPosLeft) * interp); @@ -116,22 +113,22 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glPushMatrix(); int girderSpan = 0; GL11.glRotatef(-craneRotationOffset, 0F, 1F, 0F); - switch(craneRotationOffset) { + switch((craneRotationOffset + teFacing) % 360) { case 0: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX - console.spanL, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX + console.spanB, 0, 0); break; case 90: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ + console.spanB); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ - console.spanR); break; case 180: - girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(posX + console.spanR, 0, 0); + girderSpan = console.spanF + console.spanB + 1; + GL11.glTranslated(posX - console.spanF, 0, 0); break; case 270: - girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(0, 0, -posZ - console.spanF); + girderSpan = console.spanL + console.spanR + 1; + GL11.glTranslated(0, 0, -posZ + console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); From d8080835f854d8cbbc204d1449245859e2849ebf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 00:53:14 +0300 Subject: [PATCH 08/45] Detect room bounds when linking RBMK crane --- .../render/tileentity/RenderCraneConsole.java | 10 ++++---- .../machine/rbmk/TileEntityCraneConsole.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index 8ebf386a9..3cb8e1f35 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -116,26 +116,26 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { switch((craneRotationOffset + teFacing) % 360) { case 0: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX + console.spanB, 0, 0); + GL11.glTranslated(posX - console.spanB, 0, 0); break; case 90: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ - console.spanR); + GL11.glTranslated(0, 0, -posZ + console.spanR); break; case 180: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX - console.spanF, 0, 0); + GL11.glTranslated(posX + console.spanF, 0, 0); break; case 270: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ + console.spanL); + GL11.glTranslated(0, 0, -posZ - console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); for(int i = 0; i < girderSpan; i++) { ResourceManager.rbmk_crane.renderPart("Girder"); - GL11.glTranslated(1, 0, 0); + GL11.glTranslated(-1, 0, 0); } GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index dca789607..74ce6ec07 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -275,10 +275,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.centerY = y + RBMKDials.getColumnHeight(worldObj) + 1; this.centerZ = z; - this.spanF = 16; - this.spanB = 7; - this.spanL = 7; - this.spanR = 7; + int girderY = centerY + 6; + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + this.spanF = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanR = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanB = this.findRoomExtent(x, girderY, z, dir, 0); + dir = dir.getRotation(ForgeDirection.UP); + this.spanL = this.findRoomExtent(x, girderY, z, dir, 0); this.height = 7; @@ -287,6 +293,16 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.markDirty(); } + private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int def) { + for (int i = 1; i < 32; i++) { + if (!worldObj.isAirBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i)) { + return i - 1; + } + } + + return def; + } + public void cycleCraneRotation() { this.craneRotationOffset = (this.craneRotationOffset + 90) % 360; } From 0e5e114b1267a0a7bf63b1eff046597191663fcd Mon Sep 17 00:00:00 2001 From: abel1502 Date: Tue, 8 Jul 2025 19:13:04 +0300 Subject: [PATCH 09/45] Stop QE sliding door model clipping --- src/main/java/com/hbm/tileentity/DoorDecl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index d28ae1e22..ee1c96bc0 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -586,7 +586,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) public void doOffsetTransform() { - GL11.glTranslated(0.4375, 0, 0.5); + GL11.glTranslated(0.40625, 0, 0.5); }; @Override @@ -598,12 +598,12 @@ public abstract class DoorDecl { public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { if(open) { if(z == 0) { - return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 0.125, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 0.125, 1, 1); } } else { - return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.125, 1, 1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.1875, 1, 1, 1); } }; From 19fd4791705c945df04b41b6b8f7fbc9afa9c54d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Wed, 9 Jul 2025 01:48:51 +0300 Subject: [PATCH 10/45] Fix stuff --- .../render/tileentity/RenderCraneConsole.java | 10 +++++----- .../machine/rbmk/TileEntityCraneConsole.java | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java index 3cb8e1f35..87fc5309e 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCraneConsole.java @@ -113,22 +113,22 @@ public class RenderCraneConsole extends TileEntitySpecialRenderer { GL11.glPushMatrix(); int girderSpan = 0; GL11.glRotatef(-craneRotationOffset, 0F, 1F, 0F); - switch((craneRotationOffset + teFacing) % 360) { + switch(craneRotationOffset) { case 0: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX - console.spanB, 0, 0); + GL11.glTranslated(posX + console.spanB, 0, 0); break; case 90: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ + console.spanR); + GL11.glTranslated(0, 0, -posZ - console.spanR); break; case 180: girderSpan = console.spanF + console.spanB + 1; - GL11.glTranslated(posX + console.spanF, 0, 0); + GL11.glTranslated(posX - console.spanF, 0, 0); break; case 270: girderSpan = console.spanL + console.spanR + 1; - GL11.glTranslated(0, 0, -posZ - console.spanL); + GL11.glTranslated(0, 0, -posZ + console.spanL); break; } GL11.glRotatef(craneRotationOffset, 0F, 1F, 0F); diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 74ce6ec07..2c3b4ebb4 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -277,14 +277,14 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp int girderY = centerY + 6; - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - this.spanF = this.findRoomExtent(x, girderY, z, dir, 0); + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); + this.spanF = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanR = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanR = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanB = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanB = this.findRoomExtent(x, girderY, z, dir, 16); dir = dir.getRotation(ForgeDirection.UP); - this.spanL = this.findRoomExtent(x, girderY, z, dir, 0); + this.spanL = this.findRoomExtent(x, girderY, z, dir, 16); this.height = 7; @@ -293,14 +293,14 @@ public class TileEntityCraneConsole extends TileEntityLoadedBase implements Simp this.markDirty(); } - private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int def) { - for (int i = 1; i < 32; i++) { + private int findRoomExtent(int x, int y, int z, ForgeDirection dir, int max) { + for (int i = 1; i < max; i++) { if (!worldObj.isAirBlock(x + dir.offsetX * i, y, z + dir.offsetZ * i)) { return i - 1; } } - return def; + return max; } public void cycleCraneRotation() { From dcdf5c4f27d92f50606d328145e7d7cb650d82e8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 9 Jul 2025 09:57:49 +0200 Subject: [PATCH 11/45] Revert "Merge pull request #2261 from 70000hp/the-lob-block" This reverts commit f24c244730c0ae9bf83437b5d2f0d062a5482e61, reversing changes made to 0cf9d88e36f0a7209a840419ce1f3cbf277e3a9a. --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 - .../hbm/blocks/generic/BlockWandSpawner.java | 343 ------------------ .../hbm/blocks/generic/DungeonSpawner.java | 191 ++++------ src/main/java/com/hbm/main/MainRegistry.java | 2 - .../java/com/hbm/main/ModEventHandler.java | 140 ++++++- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ---------- .../world/gen/util/DungeonSpawnerActions.java | 261 ------------- .../gen/util/DungeonSpawnerConditions.java | 96 ----- .../gen/util/DungeonSpawnerInteractions.java | 80 ---- src/main/resources/assets/hbm/lang/en_US.lang | 2 - .../hbm/textures/blocks/wand_spawner.png | Bin 730 -> 0 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 743 -> 0 bytes 13 files changed, 199 insertions(+), 1121 deletions(-) delete mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java delete mode 100644 src/main/java/com/hbm/util/MobUtil.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java delete mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java delete mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f69f85497..f6dcd2065 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,7 +1243,6 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; - public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2397,8 +2396,6 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); - wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); - } private static void registerBlock() { @@ -3545,7 +3542,6 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); - register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java deleted file mode 100644 index b6c042838..000000000 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ /dev/null @@ -1,343 +0,0 @@ -package com.hbm.blocks.generic; - -import api.hbm.block.IToolable; -import com.hbm.blocks.IBlockSideRotation; -import com.hbm.blocks.ILookOverlay; -import com.hbm.blocks.ITooltipProvider; -import com.hbm.blocks.ModBlocks; -import com.hbm.config.StructureConfig; -import com.hbm.interfaces.IBomb; -import com.hbm.interfaces.ICopiable; -import com.hbm.lib.RefStrings; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.TileEntityLoadedBase; -import com.hbm.util.BufferUtil; -import com.hbm.util.i18n.I18nUtil; -import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.ArrayList; -import java.util.List; - -public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { - - @SideOnly(Side.CLIENT) protected IIcon iconTop; - - public BlockWandSpawner() { - super(Material.iron); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); - } - - @Override - public IIcon getIcon(int side, int meta) { - return (side <= 1) ? iconTop : blockIcon; - } - - @Override - public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { - if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); - if(side == 1) return world.getBlockMetadata(x, y, z); - return 0; - } - - @Override - public int getRenderType() { - return IBlockSideRotation.getRenderType(); - } - - @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, 3, 2); - if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); - if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); - if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); - - ForgeDirection dir = ForgeDirection.UNKNOWN; - switch(i){ - case 0: dir = ForgeDirection.SOUTH;break; - case 1: dir = ForgeDirection.WEST; break; - case 2: dir = ForgeDirection.NORTH;break; - case 3: dir = ForgeDirection.EAST; break; - } - TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); - } - - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { - - ItemStack stack = player.getHeldItem(); - - if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { - ItemBlock ib = (ItemBlock) stack.getItem(); - Block block = ib.field_150939_a; - - if (block.renderAsNormalBlock() && block != this) { - - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityWandSpawner){ - TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; - spawner.disguise = block; - spawner.disguiseMeta = stack.getItemDamage() & 15; - return true; - } - } - } - return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); - } - - @Override - public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return false; - - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - - switch(tool) { - case SCREWDRIVER: - List actionNames = DungeonSpawnerActions.getActionNames(); - int indexA = actionNames.indexOf(spawner.actionID); - - indexA += player.isSneaking() ? -1 : 1; - indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); - - spawner.actionID = actionNames.get(indexA); - return true; - case DEFUSER: - List conditionNames = DungeonSpawnerConditions.getConditionNames(); - int indexC = conditionNames.indexOf(spawner.conditionID); - - indexC += player.isSneaking() ? -1 : 1; - indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); - - spawner.conditionID = conditionNames.get(indexC); - - return true; - case HAND_DRILL: - List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); - int indexI = interactionNames.indexOf(spawner.interactionID); - - indexI += player.isSneaking() ? -1 : 1; - indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); - - spawner.interactionID = interactionNames.get(indexI); - - return true; - - default: return false; - } - } - - @Override - public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return; - - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - - List text = new ArrayList<>(); - text.add("Action: " + spawner.actionID); - text.add("Condition: " + spawner.conditionID); - text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); - - String block; - - if(spawner.disguise != null && spawner.disguise != Blocks.air) - block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); - else - block = "None"; - - text.add("Disguise Block: " + block); - - ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); - list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); - list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); - } - - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityWandSpawner(); - } - - @Override - public BombReturnCode explode(World world, int x, int y, int z) { - TileEntity te = world.getTileEntity(x, y, z); - - if(!(te instanceof TileEntityWandSpawner)) return null; - - ((TileEntityWandSpawner) te).triggerReplace = true; - - return BombReturnCode.TRIGGERED; - } - - public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { - private boolean triggerReplace; - - public int placedRotation; - - Block disguise; - int disguiseMeta = -1; - - public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "EMPTY"; - public String interactionID; - - @Override - public void updateEntity() { - if(!worldObj.isRemote) { - if(triggerReplace) { - // On the first tick of this TE, replace with intended block and fill with loot - replace(); - } else { - networkPackNT(15); - } - } - } - - private void replace() { - if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { - MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); - return; - } - worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); - - TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); - - if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { - MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); - te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); - worldObj.setTileEntity(xCoord, yCoord, zCoord, te); - } - - if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ - DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; - spawner.actionID = actionID; - spawner.conditionID = conditionID; - spawner.interactionID = interactionID; - spawner.direction = ForgeDirection.getOrientation(placedRotation); - spawner.disguise = disguise; - spawner.disguiseMeta = disguiseMeta; - } - - } - - @Override - public void transformTE(World world, int coordBaseMode) { - triggerReplace = !StructureConfig.debugStructures; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - nbt.setString("interactionID", interactionID); - nbt.setInteger("rotation", placedRotation); - if(disguise != null){ - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - nbt.setInteger("disguiseMeta", disguiseMeta); - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - actionID = nbt.getString("actionID"); - conditionID = nbt.getString("conditionID"); - interactionID = nbt.getString("interactionID"); - placedRotation = nbt.getInteger("rotation"); - if(nbt.hasKey("disguise")){ - disguise = Block.getBlockFromName(nbt.getString("disguise")); - disguiseMeta = nbt.getInteger("disguiseMeta"); - } - } - - @Override - public void serialize(ByteBuf buf) { - buf.writeInt(placedRotation); - BufferUtil.writeString(buf, actionID); - BufferUtil.writeString(buf, conditionID); - BufferUtil.writeString(buf, interactionID); - buf.writeInt(Block.getIdFromBlock(disguise)); - buf.writeInt(disguiseMeta); - } - - @Override - public void deserialize(ByteBuf buf) { - placedRotation = buf.readInt(); - actionID = BufferUtil.readString(buf); - conditionID = BufferUtil.readString(buf); - interactionID = BufferUtil.readString(buf); - disguise = Block.getBlockById(buf.readInt()); - disguiseMeta = buf.readInt(); - } - - @Override - public NBTTagCompound getSettings(World world, int x, int y, int z) { - NBTTagCompound nbt = new NBTTagCompound(); - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - if(disguise != null){ - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - nbt.setInteger("disguiseMeta", disguiseMeta); - } - - return nbt; - } - - @Override - public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { - actionID = nbt.getString("actionID"); - conditionID = nbt.getString("conditionID"); - interactionID = nbt.getString("interactionID"); - if(nbt.hasKey("disguise")){ - disguise = Block.getBlockFromName(nbt.getString("disguise")); - disguiseMeta = nbt.getInteger("disguiseMeta"); - } - } - } -} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 52dbb6099..4a6fc10d8 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,32 +7,18 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.BufferUtil; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.util.EnumUtil; import com.hbm.util.Vec3NT; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; 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.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,76 +30,19 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityDungeonSpawner){ - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; - if(spawner.disguise != null){ - return spawner.disguise.getIcon(side, spawner.disguiseMeta); - } - } - - return super.getIcon(world, x, y, z, side); - } - - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - TileEntity te = worldIn.getTileEntity(x, y, z); - if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { - ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); - return true; - } - - return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); - } - + public static class TileEntityDungeonSpawner extends TileEntity { - - //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; public int timer = 0; - - public Block disguise; - public int disguiseMeta; - - /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ - public String conditionID = "ABERRATOR"; - public String actionID = "ABERRATOR"; - /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ - public String interactionID; - - public Function condition; - public Consumer action; - /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ - public Consumer interaction; - - public EntityPlayer player; - - public ForgeDirection direction = ForgeDirection.UNKNOWN; + public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - if(action == null){ - action = DungeonSpawnerActions.actions.get(actionID); - } - if(condition == null){ - condition = DungeonSpawnerConditions.conditions.get(conditionID); - } - if(interaction == null && interactionID != null){ - interaction = DungeonSpawnerInteractions.interactions.get(interactionID); - } - - if(action == null || condition == null){ - worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); - return; - } - action.accept(this); - if(condition.apply(this)) { + type.phase.accept(this); + if(type.phaseCondition.apply(this)) { phase++; timer = 0; } else { @@ -126,47 +55,83 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - - nbt.setInteger("direction", direction.ordinal()); - if(disguise != null){ - nbt.setInteger("disguiseMeta", disguiseMeta); - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - } + nbt.setByte("type", (byte) type.ordinal()); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - - this.actionID = nbt.getString("actionID"); - this.conditionID = nbt.getString("conditionID"); - if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); - - this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); - - if(nbt.hasKey("disguise")){ - disguiseMeta = nbt.getInteger("disguiseMeta"); - disguise = Block.getBlockFromName(nbt.getString("disguise")); - } - } - - @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()); + this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); } } + + public static enum EnumSpawnerType { + + ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); + public Function phaseCondition; + public Consumer phase; + + private EnumSpawnerType(Function con, Consumer ph) { + this.phaseCondition = con; + this.phase = ph; + } + } + + public static Function CON_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1 || tile.phase == 2) { + if(tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for(int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for(int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if(mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if(tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if(te instanceof TileEntitySkeletonHolder) { + TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; + if(world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 199127431..0d64ee670 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,8 +877,6 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); - MobUtil.intializeMobPools(); - proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 655656174..cd368b165 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,18 +387,74 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - slotPools = MobUtil.slotPoolCommon; + + if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine + equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); + return; + } + + slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPools.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPools.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPools.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPools.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, + {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} + })); } else if(entity instanceof EntitySkeleton) { - slotPools = MobUtil.slotPoolRanged; + + slotPools.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPools.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPools.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPools.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - MobUtil.assignItemsToEntity(entity, slotPools, rand); + assignItemsToEntity(entity, slotPools); + } + + private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -417,30 +473,74 @@ public class ModEventHandler { return pool; } - private static ItemStack getSkelegun(float soot, Random rand) { - if (!MobConfig.enableMobWeapons) return null; - if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList<>(); + public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); - if(soot < 0.3){ - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); - pool.add(new WeightedRandomObject(null, 20)); - } else if(soot > 0.3 && soot < 1) { - pool.addAll(MobUtil.slotPoolGuns.get(0.3)); - } else if (soot < 3) { - pool.addAll(MobUtil.slotPoolGuns.get(1D)); - } else if (soot < 5) { - pool.addAll(MobUtil.slotPoolGuns.get(3D)); - } else { - pool.addAll(MobUtil.slotPoolGuns.get(5D)); + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } } + } + + private static ItemStack getSkelegun(float soot, Random rand) { + if(!MobConfig.enableMobWeapons) return null; + if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + + ArrayList pool = new ArrayList(); + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); + if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); + + if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); + if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); + + if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); + if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); + + if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } + // these fucking tasks keep stacking on top of themselves + private static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } + @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -449,7 +549,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - MobUtil.addFireTask(living); + addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f688059be..ca3281bd1 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,7 +19,6 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; -import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -237,7 +236,6 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); - put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -430,7 +428,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java deleted file mode 100644 index 8779c1ed2..000000000 --- a/src/main/java/com/hbm/util/MobUtil.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.hbm.util; - -import com.hbm.entity.mob.ai.EntityAIFireGun; -import com.hbm.items.ModItems; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAITasks; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.WeightedRandom; - -import java.util.*; - -public class MobUtil { - - - public static Map> slotPoolCommon = new HashMap<>(); - public static Map> slotPoolRanged = new HashMap<>(); - - public static Map> slotPoolAdv = new HashMap<>(); - public static Map> slotPoolAdvRanged; - /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ - public static HashMap> slotPoolGuns = new HashMap<>(); - - - public static void intializeMobPools(){ - slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, - {ModItems.wrench, 20} - })); - - slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - - slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ - {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} - })); - slotPoolGuns.put(1D, createSlotPool(new Object[][]{ - {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} - })); - slotPoolGuns.put(3D, createSlotPool(new Object[][]{ - {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} - })); - slotPoolGuns.put(5D, createSlotPool(new Object[][]{ - {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} - })); - - slotPoolAdv.put(4, createSlotPool(new Object[][]{ - {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, - {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, - {ModItems.hazmat_helmet, 6} - })); - slotPoolAdv.put(3, createSlotPool(new Object[][]{ - {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, - {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, - {ModItems.steel_plate, 8} - })); - slotPoolAdv.put(2, createSlotPool(new Object[][]{ - {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, - {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, - {ModItems.steel_legs, 8} - })); - slotPoolAdv.put(1, createSlotPool(new Object[][]{ - {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, - {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, - {ModItems.robes_boots, 8} - })); - slotPoolAdv.put(0, createSlotPool(new Object[][]{ - {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, - {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, - {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, - {ModItems.wrench, 20} - })); - - slotPoolAdvRanged = new HashMap<>(slotPoolAdv); - slotPoolAdvRanged.remove(0); - - } - - public static List createSlotPool(int nullWeight, Object[][] items) { - List pool = new ArrayList<>(); - pool.add(new WeightedRandomObject(null, nullWeight)); - for (Object[] item : items) { - Object obj = item[0]; - int weight = (int) item[1]; - - if (obj instanceof Item) { - pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); - } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell - pool.add(new WeightedRandomObject(obj, weight)); - } - } - return pool; - } - public static List createSlotPool(Object[][] items) { - List pool = new ArrayList<>(); - for (Object[] item : items) { - Object obj = item[0]; - int weight = (int) item[1]; - - if (obj instanceof Item) { - pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); - } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell - pool.add(new WeightedRandomObject(obj, weight)); - } - } - return pool; - } - - public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); - } - - public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - - // these fucking tasks keep stacking on top of themselves - public static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java deleted file mode 100644 index fee835c2e..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.BlockDummyable; -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockSkeletonHolder; -import com.hbm.blocks.generic.DungeonSpawner; -import com.hbm.entity.item.EntityFallingBlockNT; -import com.hbm.entity.missile.EntityMissileTier2; -import com.hbm.entity.mob.EntityUndeadSoldier; -import com.hbm.items.ItemEnums; -import com.hbm.items.ModItems; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; -import com.hbm.util.ContaminationUtil; -import com.hbm.util.MobUtil; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.init.Blocks; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.*; -import java.util.function.Consumer; - -public class DungeonSpawnerActions { - - public static LinkedHashMap> actions = new LinkedHashMap<>(); - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if (tile.phase == 1 || tile.phase == 2) { - if (tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for (int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if (mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if (tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { - BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; - if (world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; - - public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 0) return; - - //from explosionChaos because i cannot be assed - int r = 4; - int r2 = r * r; - int r22 = r2 / 2; - - for (int xx = -r; xx < r; xx++) { - int X = xx + x; - int XX = xx * xx; - for (int yy = -r; yy < r; yy++) { - int Y = yy + y; - int YY = XX + yy * yy; - for (int zz = -r; zz < r; zz++) { - int Z = zz + z; - int ZZ = YY + zz * zz; - if (ZZ < r22) { - - if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { - EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); - world.spawnEntityInWorld(entityfallingblock); - } - } - } - } - } - world.setBlock(x, y, z, ModBlocks.block_steel); - - }; - - public static Consumer FODDER_WAVE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if (tile.phase == 1) { - Vec3NT vec = new Vec3NT(5, 0, 0); - for (int i = 0; i < 10; i++) { - EntityZombie mob = new EntityZombie(world); - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - world.spawnEntityInWorld(mob); - - vec.rotateAroundYDeg(36D); - } - world.setBlock(x, y, z, ModBlocks.block_steel); - } - }; - - public static Consumer PUZZLE_TEST = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 2){ - world.setBlock(x,y,z, ModBlocks.crate_steel); - - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); - world.spawnEntityInWorld(blitz); - - TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); - ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); - } - }; - - public static Consumer MISSILE_STRIKE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase != 1) return; - - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); - - ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); - - EntityMissileTier2.EntityMissileStrong missile = - new EntityMissileTier2.EntityMissileStrong( - world, - x + tile.direction.offsetX * 300, - 200, - z + tile.direction.offsetZ * 300, - x + parallel.offsetX * 30 + tile.direction.offsetX * 30, - z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); - WorldUtil.loadAndSpawnEntityInWorld(missile); - - world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); - }; - - public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - ForgeDirection direction = tile.direction.getOpposite(); - ForgeDirection rot = direction.getRotation(ForgeDirection.UP); - - AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); - - List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); - - for(EntityLivingBase e : entities) { - - Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); - double len = vec.lengthVector(); - vec = vec.normalize(); - - len = Math.max(len,1D); - - float res = 0; - - for(int i = 1; i < len; i++) { - - int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); - int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); - int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); - - res += world.getBlock(ix, iy, iz).getExplosionResistance(null); - } - - if(res < 1) - res = 1; - - float eRads = 100F; - eRads /= (float)res; - eRads /= (float)(len * len); - - ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); - } - - if (tile.phase == 2 && tile.timer > 40){ - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( - EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + - EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); - - for(int i = 1; i < 20; i++) { - int checkX, checkY, checkZ; - checkX = x + direction.offsetX * i; - checkY = y + 1; - checkZ = z + direction.offsetZ * i; - Block block = world.getBlock(checkX, checkY,checkZ); - TileEntity te = null; - if(block instanceof BlockDummyable){ - int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); - te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); - } - - if (te instanceof TileEntityDoorGeneric) { - TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; - door.setPins(456); - door.close(); - door.lock(); - break; - } - } - - tile.phase = 3; - } - }; - - public static List getActionNames(){ - return new ArrayList<>(actions.keySet()); - } - - //register new actions here - static{ - actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); - actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); - actions.put("FODDER_WAVE", FODDER_WAVE); - actions.put("PUZZLE_TEST", PUZZLE_TEST); - actions.put("MISSILE_STRIKE", MISSILE_STRIKE); - actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); - } - - - -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java deleted file mode 100644 index 83dd773e8..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; -import com.hbm.blocks.generic.DungeonSpawner; -import com.hbm.entity.mob.EntityUndeadSoldier; -import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.function.Function; - -public class DungeonSpawnerConditions { - - public static LinkedHashMap> conditions = new LinkedHashMap<>(); - - /**For use with interactions, for having them handle all conditional tasks*/ - public static Function EMPTY = (tile) -> false; - - public static Function ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Function PLAYER_CUBE_5 = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); - }; - - public static Function REDSTONE = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - return world.isBlockIndirectlyGettingPowered(x,y,z); - }; - - public static Function PUZZLE_TEST = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - - if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ - world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); - world.setBlock(x,y + 1,z, ModBlocks.pedestal); - return true; - } - - TileEntity pedestal = world.getTileEntity(x,y + 1,z); - - return tile.phase == 1 - && pedestal instanceof BlockPedestal.TileEntityPedestal - && ((BlockPedestal.TileEntityPedestal) pedestal).item != null - && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; - }; - - public static List getConditionNames(){ - return new ArrayList<>(conditions.keySet()); - } - - //register new conditions here - static { - conditions.put("EMPTY", EMPTY); - conditions.put("ABERRATOR", ABERRATOR); - conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); - conditions.put("REDSTONE", REDSTONE); - conditions.put("PUZZLE_TEST", PUZZLE_TEST); - } - -} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java deleted file mode 100644 index 32c19b81d..000000000 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.hbm.world.gen.util; - -import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; -import com.hbm.entity.missile.EntityMissileTier2; -import com.hbm.items.ModItems; -import com.hbm.potion.HbmPotion; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.function.Consumer; - -/**Interactions are called when the player right-clicks the block**/ -public class DungeonSpawnerInteractions { - - /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, - * in that order **/ - public static LinkedHashMap> interactions = new LinkedHashMap<>(); - - public static Consumer TEST = (array) -> { - World world = (World) array[0]; - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; - int x = (int) array[2]; - int y = (int) array[3]; - int z = (int) array[4]; - EntityPlayer player = (EntityPlayer) array[5]; - int side = (int) array[6]; - - if(spawner.phase > 1) return; - - if(player.getHeldItem() != null) - player.getHeldItem().stackSize--; - - spawner.phase++; - }; - - public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; - EntityPlayer player = (EntityPlayer) array[5]; - - if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ - player.getHeldItem().stackSize--; - player.addChatMessage(new ChatComponentText( - EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + - EnumChatFormatting.RESET + " Radiation treatment administered")); - player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); - player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); - spawner.phase = 2; - spawner.timer = 0; - } - }; - - - - public static List getInteractionNames(){ - return new ArrayList<>(interactions.keySet()); - } - - //register new interactions here - static{ - interactions.put("TEST", TEST); - interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); - } - - - -} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index dcb6d68b3..74c5a343b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,7 +5279,6 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain -tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -6062,7 +6061,6 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) -tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png deleted file mode 100644 index 4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png deleted file mode 100644 index 65e3106a96f970891be895a960ccfb53a60b3915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flMn;7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`VaCJ Date: Wed, 9 Jul 2025 16:56:42 +0200 Subject: [PATCH 12/45] scum construction machine --- changelog | 24 +++------ .../java/com/hbm/inventory/material/Mats.java | 2 +- .../inventory/recipes/AssemblerRecipes.java | 3 +- .../recipes/AssemblyMachineRecipes.java | 51 +++++++++++++++++-- src/main/java/com/hbm/items/ModItems.java | 3 -- src/main/java/com/hbm/main/MainRegistry.java | 1 + 6 files changed, 57 insertions(+), 27 deletions(-) diff --git a/changelog b/changelog index 666ddeaaa..d6b838a91 100644 --- a/changelog +++ b/changelog @@ -1,19 +1,7 @@ -## Changed -* The chemistry achievement now requires the new chemical plant -* The new chemical plant can now be used to upgrade the meteorite sword -* Fluid containers are now re-registered when using `/ntmreload` which should correctly generate fluid container items for freshly added custom fluids -* Recipe configs will no longer try to parse null value recipes, meaing that trailing commas in a recipe config will no longer create an error -* Refinery solid byproducts now build up substantially faster - * This means fracking solution from standard oil is now a lot more viable - * This also makes the volume of oil spent consistent with the NEI handler +## Added +* New assembler -## Fixed -* Fixed crash caused by breaking a tool while the fortune or silk touch ability is enabled -* Fixed NTM adding mob spawns to the mushroom island -* Fixed line break not working on the tip of the day -* Fixed an issue where AoE abilities can break bedrock -* Fixed chemical factory not saving its water and steam tanks -* Fixed siphon not working with some newer machines due to using legacy API -* Potentially fixed an incompatibility with Aether due to the loading screen replacement - * The loading screen replacement will only run up to 25 times per session, with a fixed delay of 5 seconds minimum - * The loading screen replacement can be disabled completely in the config \ No newline at end of file +## Changed +* Removed levitation unit + +## Fixed \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 6e810bbcc..5a03bf288 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -136,7 +136,7 @@ public class Mats { //Alloys 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_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, DENSEWIRE, 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, 0x82A59C, 0x06281E, 0x42665C).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(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index e1efbf9db..233f67933 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -79,7 +79,6 @@ public class AssemblerRecipes extends SerializableRecipe { 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.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); makeRecipe(new ComparableStack(ModItems.drill_titanium, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 2), new OreDictStack(DURA.ingot(), 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(TI.plate(), 6), },100); makeRecipe(new ComparableStack(ModItems.entanglement_kit, 1), new AStack[] {new OreDictStack(STEEL.plate(), 8), new OreDictStack(DURA.ingot(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(Fluids.XENON.getDict(1_000))},200); makeRecipe(new ComparableStack(ModItems.dysfunctional_reactor, 1), new AStack[] {new OreDictStack(STEEL.plate(), 15), new OreDictStack(PB.ingot(), 5), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack("dyeBrown", 3), },200); @@ -168,7 +167,7 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.nuke_n2, 1), new AStack[] {new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack("dyeBlack", 8), },300); makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 8), },600, ModItems.journal_pip, ModItems.journal_bj); makeRecipe(new ComparableStack(ModBlocks.nuke_custom, 1), new AStack[] {new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack("dyeGray", 4), },300); - makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireFine(), 6), },250); + makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index c018e55c9..1e741f6b7 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -7,7 +7,9 @@ import java.util.List; import static com.hbm.inventory.OreDictManager.*; import static com.hbm.inventory.material.Mats.*; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; +import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; @@ -15,7 +17,9 @@ import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; public class AssemblyMachineRecipes extends GenericRecipes { @@ -33,9 +37,50 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public void registerDefaults() { - this.register(new GenericRecipe("ass.test").setup(100, 1_000) - .inputItems(new OreDictStack(STEEL.ingot(), 5)) - .outputItems(new ItemStack(ModItems.plate_welded, 1, MAT_STEEL.id))); + // plates and ingots + this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) + .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); + this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) + .inputItems(new ComparableStack(ModBlocks.block_meteor, 1))); + + // cloth + this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) + .inputItems(new OreDictStack(PB.dust(), 4), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.firecloth").setup(50, 100).outputItems(new ItemStack(ModItems.asbestos_cloth, 4)) + .inputItems(new OreDictStack(ASBESTOS.ingot(), 1), new ComparableStack(Items.string, 8))); + this.register(new GenericRecipe("ass.filtercoal").setup(50, 100).outputItems(new ItemStack(ModItems.filter_coal, 1)) + .inputItems(new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1))); + + // machine parts + this.register(new GenericRecipe("ass.centrifugetower").setup(100, 100).outputItems(new ItemStack(ModItems.centrifuge_element, 1)) + .inputItems(new OreDictStack(DURA.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.reactorcore").setup(100, 100).outputItems(new ItemStack(ModItems.reactor_core, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 4), new OreDictStack(BE.ingot(), 8), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(ASBESTOS.ingot(), 4))); + this.register(new GenericRecipe("ass.thermoelement").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(MINGRADE.wireFine(), 2), new OreDictStack(NETHERQUARTZ.dust(), 2))); + this.register(new GenericRecipe("ass.thermoelementsilicon").setup(60, 100).outputItems(new ItemStack(ModItems.thermo_element, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(GOLD.wireFine(), 2), new OreDictStack(SI.billet(), 1))); + this.register(new GenericRecipe("ass.rtgunit").setup(100, 100).outputItems(new ItemStack(ModItems.rtg_unit, 1)) + .inputItems(new OreDictStack(PB.plateCast(), 2), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.thermo_element, 2))); + this.register(new GenericRecipe("ass.titaniumdrill").setup(100, 100).outputItems(new ItemStack(ModItems.drill_titanium, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 1), new OreDictStack(TI.plate(), 8))); + + // bunker blocks + this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); + this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) + .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); + this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // machines + this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 7387de265..b66b8f403 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -560,7 +560,6 @@ public class ModItems { public static Item centrifuge_element; public static Item reactor_core; public static Item rtg_unit; - public static Item levitation_unit; public static Item coil_advanced_alloy; public static Item coil_advanced_torus; @@ -2724,7 +2723,6 @@ public class ModItems { centrifuge_element = new Item().setUnlocalizedName("centrifuge_element").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":centrifuge_element"); reactor_core = new Item().setUnlocalizedName("reactor_core").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":reactor_core"); rtg_unit = new Item().setUnlocalizedName("rtg_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":rtg_unit"); - levitation_unit = new Item().setUnlocalizedName("levitation_unit").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":levitation_unit"); 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"); @@ -5511,7 +5509,6 @@ public class ModItems { GameRegistry.registerItem(centrifuge_element, centrifuge_element.getUnlocalizedName()); GameRegistry.registerItem(reactor_core, reactor_core.getUnlocalizedName()); GameRegistry.registerItem(rtg_unit, rtg_unit.getUnlocalizedName()); - GameRegistry.registerItem(levitation_unit, levitation_unit.getUnlocalizedName()); GameRegistry.registerItem(pipes_steel, pipes_steel.getUnlocalizedName()); GameRegistry.registerItem(drill_titanium, drill_titanium.getUnlocalizedName()); GameRegistry.registerItem(photo_panel, photo_panel.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0d64ee670..4c8e7f954 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1701,6 +1701,7 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.hadron_cooler"); ignoreMappings.add("hbm:tile.machine_transformer_20"); ignoreMappings.add("hbm:tile.machine_transformer_dnt_20"); + ignoreMappings.add("hbm:item.levitation_unit"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); From 453c47c6f0037374e4ef25a034326e40178153ea Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 13/45] the gob block --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 + .../hbm/blocks/generic/BlockWandSpawner.java | 249 ++++++++++++++++++ .../hbm/blocks/generic/DungeonSpawner.java | 106 ++------ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../java/com/hbm/main/ModEventHandler.java | 140 ++-------- .../java/com/hbm/tileentity/TileMappings.java | 4 +- src/main/java/com/hbm/util/MobUtil.java | 197 ++++++++++++++ .../world/gen/util/DungeonSpawnerActions.java | 165 ++++++++++++ .../gen/util/DungeonSpawnerConditions.java | 91 +++++++ src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/blocks/wand_spawner.png | Bin 0 -> 730 bytes .../hbm/textures/blocks/wand_spawner_top.png | Bin 0 -> 740 bytes 12 files changed, 760 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java create mode 100644 src/main/java/com/hbm/util/MobUtil.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f6dcd2065..f69f85497 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,6 +1243,7 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; + public static Block wand_spawner; public static Material materialGas = new MaterialGas(); @@ -2396,6 +2397,8 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); + wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + } private static void registerBlock() { @@ -3542,6 +3545,7 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); + register(wand_spawner); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java new file mode 100644 index 000000000..fdfca7689 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -0,0 +1,249 @@ +package com.hbm.blocks.generic; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.interfaces.IBomb; +import com.hbm.interfaces.ICopiable; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandSpawner() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @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, 3, 2); + if (i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityWandSpawner) + ((TileEntityWandSpawner)te).placedRotation = i; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return false; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + switch(tool) { + case SCREWDRIVER: + List actionNames = DungeonSpawnerActions.getActionNames(); + int indexA = actionNames.indexOf(spawner.actionID); + + indexA += player.isSneaking() ? -1 : 1; + indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); + + spawner.actionID = actionNames.get(indexA); + return true; + case DEFUSER: + List conditionNames = DungeonSpawnerConditions.getConditionNames(); + int indexC = conditionNames.indexOf(spawner.conditionID); + + indexC += player.isSneaking() ? -1 : 1; + indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); + + spawner.conditionID = conditionNames.get(indexC); + + return true; + + default: return false; + } + } + + @Override + public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return; + + TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + + List text = new ArrayList(); + text.add("Action: " + spawner.actionID); + text.add("Condition: " + spawner.conditionID); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); + list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityWandSpawner(); + } + + @Override + public BombReturnCode explode(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandSpawner)) return null; + + ((TileEntityWandSpawner) te).triggerReplace = true; + + return BombReturnCode.TRIGGERED; + } + + public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + private boolean triggerReplace; + + public int placedRotation; + + public String actionID = "PHASE_ABERRATOR"; + public String conditionID = "ABERRATOR"; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + return; + } + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { + MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + worldObj.setTileEntity(xCoord, yCoord, zCoord, te); + } + + if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ + DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; + spawner.actionID = actionID; + spawner.conditionID = conditionID; + } + + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + nbt.setInteger("rotation", placedRotation); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + placedRotation = nbt.getInteger("rotation"); + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(placedRotation); + BufferUtil.writeString(buf, actionID); + BufferUtil.writeString(buf, conditionID); + } + + @Override + public void deserialize(ByteBuf buf) { + placedRotation = buf.readInt(); + actionID = BufferUtil.readString(buf); + conditionID = BufferUtil.readString(buf); + } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + actionID = nbt.getString("actionID"); + conditionID = nbt.getString("conditionID"); + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 4a6fc10d8..ffbb14239 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,7 +7,8 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.EnumUtil; +import com.hbm.world.gen.util.DungeonSpawnerActions; +import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; import net.minecraft.block.BlockContainer; @@ -30,19 +31,35 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - + public static class TileEntityDungeonSpawner extends TileEntity { - + public int phase = 0; public int timer = 0; - public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; - + + public String conditionID = "ABERRATOR"; + //actions always get called before conditions, use the phase timer in order to control behavior via condition + public String actionID = "ABERRATOR"; + + public Function condition; + public Consumer action; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - type.phase.accept(this); - if(type.phaseCondition.apply(this)) { + if(action == null){ + action = DungeonSpawnerActions.actions.get(actionID); + } + if(condition == null){ + condition = DungeonSpawnerConditions.conditions.get(conditionID); + } + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { phase++; timer = 0; } else { @@ -55,83 +72,16 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setByte("type", (byte) type.ordinal()); + nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); + this.conditionID = nbt.getString("conditionID"); } } - - public static enum EnumSpawnerType { - - ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); - public Function phaseCondition; - public Consumer phase; - - private EnumSpawnerType(Function con, Consumer ph) { - this.phaseCondition = con; - this.phase = ph; - } - } - - public static Function CON_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - if(world.difficultySetting.ordinal() == 0) return false; - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 0) { - if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); - } - if(tile.phase < 3) { - if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); - } - return false; - }; - - public static Consumer PHASE_ABERRATOR = (tile) -> { - World world = tile.getWorldObj(); - int x = tile.xCoord; - int y = tile.yCoord; - int z = tile.zCoord; - if(tile.phase == 1 || tile.phase == 2) { - if(tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); - for(int i = 0; i < 10; i++) { - EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - for(int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); - if(mob.getCanSpawnHere()) { - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); - break; - } - } - - vec.rotateAroundYDeg(36D); - } - } - } - if(tile.phase > 2) { - TileEntity te = world.getTileEntity(x, y + 18, z); - if(te instanceof TileEntitySkeletonHolder) { - TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; - if(world.rand.nextInt(5) == 0) { - skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); - } else { - skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); - } - skeleton.markDirty(); - world.markBlockForUpdate(x, y + 18, z); - } - world.setBlock(x, y, z, Blocks.obsidian); - } - }; } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4c8e7f954..0891e4012 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -877,6 +877,8 @@ public class MainRegistry { BlockToolConversion.registerRecipes(); AchievementHandler.register(); + MobUtil.intializeMobPools(); + proxy.registerMissileItems(); // Load compatibility for OC. diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index cd368b165..655656174 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -387,74 +387,18 @@ public class ModEventHandler { if(entity instanceof EntityZombie) { if(world.rand.nextFloat() < 0.005F && soot > 2) { // full hazmat zombine - equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); + MobUtil.equipFullSet(entity, ModItems.hazmat_helmet, ModItems.hazmat_plate, ModItems.hazmat_legs, ModItems.hazmat_boots); return; } - - if(world.rand.nextFloat() < 0.005F && soot > 20) { // full security zombine - equipFullSet(entity, ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots); - return; - } - - slotPools.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(7000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, - {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, - {ModItems.steel_plate, 2} - })); - slotPools.put(2, createSlotPool(7000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} - })); - slotPools.put(1, createSlotPool(7000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} - })); - slotPools.put(0, createSlotPool(10000, new Object[][]{ - {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, - {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, - {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, - {ModItems.alloy_axe, 5}, {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, - {ModItems.wrench, 20}, {ModItems.cobalt_decorated_sword, 2}, {ModItems.detonator_de, 1} - })); + slotPools = MobUtil.slotPoolCommon; } else if(entity instanceof EntitySkeleton) { - - slotPools.put(4, createSlotPool(12000, new Object[][]{ - {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, - {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, - {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, - {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} - })); - slotPools.put(3, createSlotPool(10000, new Object[][]{ - {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it - {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} - })); - slotPools.put(2, createSlotPool(10000, new Object[][]{ - {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, - {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, - })); - slotPools.put(1, createSlotPool(10000, new Object[][]{ - {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, - {ModItems.titanium_boots, 6} - })); - + slotPools = MobUtil.slotPoolRanged; ItemStack bowReplacement = getSkelegun(soot, world.rand); slotPools.put(0, createSlotPool(50, bowReplacement != null ? new Object[][]{{bowReplacement, 1}} : new Object[][]{})); } - assignItemsToEntity(entity, slotPools); - } - - private void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works - entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number - entity.setCurrentItemOrArmor(3, new ItemStack(chest)); - entity.setCurrentItemOrArmor(2, new ItemStack(legs)); - entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + MobUtil.assignItemsToEntity(entity, slotPools, rand); } private List createSlotPool(int nullWeight, Object[][] items) { @@ -473,74 +417,30 @@ public class ModEventHandler { return pool; } - - public void assignItemsToEntity(EntityLivingBase entity, Map> slotPools) { - for (Map.Entry> entry : slotPools.entrySet()) { - int slot = entry.getKey(); - List pool = entry.getValue(); - - WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix - if (choice == null) { - continue; - } - - ItemStack stack = choice.asStack(); - if (stack == null || stack.getItem() == null) { - continue; - } - - if (stack.getItem() == ModItems.gas_mask_m65 //eyesore - || stack.getItem() == ModItems.gas_mask_olde - || stack.getItem() == ModItems.gas_mask_mono) { - ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); - } - - entity.setCurrentItemOrArmor(slot, stack); - - //Give skeleton AI if it has a gun - if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { - addFireTask((EntityLiving) entity); - } - } - } - private static ItemStack getSkelegun(float soot, Random rand) { - if(!MobConfig.enableMobWeapons) return null; - if(rand.nextDouble() > Math.log(soot) * 0.25) return null; + if (!MobConfig.enableMobWeapons) return null; + if (rand.nextDouble() > Math.log(soot) * 0.25) return null; - ArrayList pool = new ArrayList(); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_light_revolver), 12)); - pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_heavy_revolver), 8)); + ArrayList pool = new ArrayList<>(); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 10)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_henry), 8)); - if(soot > 2) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_greasegun), 6)); - - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_maresleg), 4)); - if(soot > 4) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_uzi), 6)); - - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_spas12), 3)); - if(soot > 8) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_am180), 4)); - - if(soot > 12) pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_congolake), 1)); + if(soot < 0.3){ + pool.add(new WeightedRandomObject(new ItemStack(ModItems.gun_pepperbox), 5)); + pool.add(new WeightedRandomObject(null, 20)); + } else if(soot > 0.3 && soot < 1) { + pool.addAll(MobUtil.slotPoolGuns.get(0.3)); + } else if (soot < 3) { + pool.addAll(MobUtil.slotPoolGuns.get(1D)); + } else if (soot < 5) { + pool.addAll(MobUtil.slotPoolGuns.get(3D)); + } else { + pool.addAll(MobUtil.slotPoolGuns.get(5D)); + } WeightedRandomObject selected = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); return selected.asStack(); } - // these fucking tasks keep stacking on top of themselves - private static void addFireTask(EntityLiving entity) { - entity.setEquipmentDropChance(0, 0); // Prevent dropping guns - - for(Object entry : entity.tasks.taskEntries) { - EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; - if(task.action instanceof EntityAIFireGun) return; - } - - entity.tasks.addTask(3, new EntityAIFireGun(entity)); - } - @SubscribeEvent public void addAITasks(EntityJoinWorldEvent event) { if(event.world.isRemote || !(event.entity instanceof EntityLiving)) return; @@ -549,7 +449,7 @@ public class ModEventHandler { ItemStack held = living.getHeldItem(); if(held != null && held.getItem() instanceof ItemGunBaseNT) { - addFireTask(living); + MobUtil.addFireTask(living); } } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index ca3281bd1..f688059be 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,6 +19,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; +import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; @@ -236,6 +237,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); @@ -428,7 +430,7 @@ public class TileMappings { put(TileEntityCranePartitioner.class, "tileentity_partitioner"); put(TileEntityFan.class, "tileentity_fan"); put(TileEntityPistonInserter.class, "tileentity_piston_inserter"); - + put(TileEntityPneumoTube.class, "tileentity_pneumatic_tube"); put(TileEntityRadioTorchSender.class, "tileentity_rtty_sender"); diff --git a/src/main/java/com/hbm/util/MobUtil.java b/src/main/java/com/hbm/util/MobUtil.java new file mode 100644 index 000000000..8779c1ed2 --- /dev/null +++ b/src/main/java/com/hbm/util/MobUtil.java @@ -0,0 +1,197 @@ +package com.hbm.util; + +import com.hbm.entity.mob.ai.EntityAIFireGun; +import com.hbm.items.ModItems; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAITasks; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.*; + +public class MobUtil { + + + public static Map> slotPoolCommon = new HashMap<>(); + public static Map> slotPoolRanged = new HashMap<>(); + + public static Map> slotPoolAdv = new HashMap<>(); + public static Map> slotPoolAdvRanged; + /**Unlike the above two, the Double is interpreted as minimum soot level, instead of armor slot **/ + public static HashMap> slotPoolGuns = new HashMap<>(); + + + public static void intializeMobPools(){ + slotPoolCommon.put(4, createSlotPool(8000, new Object[][]{ //new slots, smooth, brushed, no wrinkles // old slots, wrinkled, rusty, not smooth + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.cobalt_helmet, 2}, {ModItems.rag_piss, 1}, {ModItems.hat, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolCommon.put(3, createSlotPool(7000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.robes_plate, 32}, + {ModItems.jackt, 32}, {ModItems.jackt2, 32}, {ModItems.alloy_plate, 2}, + {ModItems.steel_plate, 2} + })); + slotPoolCommon.put(2, createSlotPool(7000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2} + })); + slotPoolCommon.put(1, createSlotPool(7000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2} + })); + slotPoolCommon.put(0, createSlotPool(10000, new Object[][]{ + {ModItems.pipe_lead, 30}, {ModItems.crowbar, 25}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 16}, {ModItems.steel_pickaxe, 12}, {ModItems.stopsign, 10}, + {ModItems.sopsign, 8}, {ModItems.chernobylsign, 6}, {ModItems.steel_sword, 15}, + {ModItems.titanium_sword, 8}, {ModItems.lead_gavel, 4}, {ModItems.wrench_flipped, 2}, + {ModItems.wrench, 20} + })); + + slotPoolRanged.put(4, createSlotPool(12000, new Object[][]{ + {ModItems.gas_mask_m65, 16}, {ModItems.gas_mask_olde, 12}, {ModItems.mask_of_infamy, 8}, + {ModItems.gas_mask_mono, 8}, {ModItems.robes_helmet, 32}, {ModItems.no9, 16}, + {ModItems.rag_piss, 1}, {ModItems.goggles, 1}, {ModItems.alloy_helmet, 2}, + {ModItems.titanium_helmet, 4}, {ModItems.steel_helmet, 8} + })); + slotPoolRanged.put(3, createSlotPool(10000, new Object[][]{ + {ModItems.starmetal_plate, 1}, {ModItems.cobalt_plate, 2}, {ModItems.alloy_plate, 2}, //sadly they cant wear jackets bc it breaks it + {ModItems.steel_plate, 8}, {ModItems.titanium_plate, 4} + })); + slotPoolRanged.put(2, createSlotPool(10000, new Object[][]{ + {ModItems.zirconium_legs, 1}, {ModItems.cobalt_legs, 2}, {ModItems.steel_legs, 16}, + {ModItems.titanium_legs, 8}, {ModItems.robes_legs, 32}, {ModItems.alloy_legs, 2}, + })); + slotPoolRanged.put(1, createSlotPool(10000, new Object[][]{ + {ModItems.robes_boots, 32}, {ModItems.steel_boots, 16}, {ModItems.cobalt_boots, 2}, {ModItems.alloy_boots, 2}, + {ModItems.titanium_boots, 6} + })); + + slotPoolGuns.put(0.3, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 16}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 2} + })); + slotPoolGuns.put(1D, createSlotPool(new Object[][]{ + {ModItems.gun_light_revolver, 6}, {ModItems.gun_greasegun, 8}, {ModItems.gun_maresleg, 4}, {ModItems.gun_henry, 6} + })); + slotPoolGuns.put(3D, createSlotPool(new Object[][]{ + {ModItems.gun_uzi, 10}, {ModItems.gun_maresleg, 8}, {ModItems.gun_henry, 12}, {ModItems.gun_heavy_revolver, 4}, {ModItems.gun_flaregun, 2} + })); + slotPoolGuns.put(5D, createSlotPool(new Object[][]{ + {ModItems.gun_am180, 6}, {ModItems.gun_uzi, 10}, {ModItems.gun_spas12, 8}, {ModItems.gun_henry_lincoln, 2}, {ModItems.gun_heavy_revolver, 12}, {ModItems.gun_flaregun, 4}, {ModItems.gun_flamer, 2} + })); + + slotPoolAdv.put(4, createSlotPool(new Object[][]{ + {ModItems.security_helmet, 10}, {ModItems.t45_helmet, 4}, {ModItems.asbestos_helmet, 12}, + {ModItems.liquidator_helmet, 4}, {ModItems.no9, 12}, + {ModItems.hazmat_helmet, 6} + })); + slotPoolAdv.put(3, createSlotPool(new Object[][]{ + {ModItems.liquidator_plate, 4}, {ModItems.security_plate, 8}, {ModItems.asbestos_plate, 12}, + {ModItems.t45_plate, 4}, {ModItems.hazmat_plate, 6}, + {ModItems.steel_plate, 8} + })); + slotPoolAdv.put(2, createSlotPool(new Object[][]{ + {ModItems.liquidator_legs, 4}, {ModItems.security_legs, 8}, {ModItems.asbestos_legs, 12}, + {ModItems.t45_legs, 4}, {ModItems.hazmat_legs, 6}, + {ModItems.steel_legs, 8} + })); + slotPoolAdv.put(1, createSlotPool(new Object[][]{ + {ModItems.liquidator_boots, 4}, {ModItems.security_boots, 8}, {ModItems.asbestos_boots, 12}, + {ModItems.t45_boots, 4}, {ModItems.hazmat_boots, 6}, + {ModItems.robes_boots, 8} + })); + slotPoolAdv.put(0, createSlotPool(new Object[][]{ + {ModItems.pipe_lead, 20}, {ModItems.crowbar, 30}, {ModItems.geiger_counter, 20}, + {ModItems.reer_graar, 20}, {ModItems.wrench_flipped, 12}, {ModItems.stopsign, 16}, + {ModItems.sopsign, 4}, {ModItems.chernobylsign, 16}, + {ModItems.titanium_sword, 18}, {ModItems.lead_gavel, 8}, + {ModItems.wrench, 20} + })); + + slotPoolAdvRanged = new HashMap<>(slotPoolAdv); + slotPoolAdvRanged.remove(0); + + } + + public static List createSlotPool(int nullWeight, Object[][] items) { + List pool = new ArrayList<>(); + pool.add(new WeightedRandomObject(null, nullWeight)); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + public static List createSlotPool(Object[][] items) { + List pool = new ArrayList<>(); + for (Object[] item : items) { + Object obj = item[0]; + int weight = (int) item[1]; + + if (obj instanceof Item) { + pool.add(new WeightedRandomObject(new ItemStack((Item) obj), weight)); + } else if (obj instanceof ItemStack) { //lol just make it pass ItemStack aswell + pool.add(new WeightedRandomObject(obj, weight)); + } + } + return pool; + } + + public static void equipFullSet(EntityLivingBase entity, Item helmet, Item chest, Item legs, Item boots) { //for brainlets (me) to add more armorsets later when i forget about how this works + entity.setCurrentItemOrArmor(4, new ItemStack(helmet)); //p_70062_1_ is the slot number + entity.setCurrentItemOrArmor(3, new ItemStack(chest)); + entity.setCurrentItemOrArmor(2, new ItemStack(legs)); + entity.setCurrentItemOrArmor(1, new ItemStack(boots)); + } + + public static void assignItemsToEntity(EntityLivingBase entity, Map> slotPools, Random rand) { + for (Map.Entry> entry : slotPools.entrySet()) { + int slot = entry.getKey(); + List pool = entry.getValue(); + + WeightedRandomObject choice = (WeightedRandomObject) WeightedRandom.getRandomItem(rand, pool); //NullPointerException sludge fix + if (choice == null) { + continue; + } + + ItemStack stack = choice.asStack(); + if (stack == null || stack.getItem() == null) { + continue; + } + + if (stack.getItem() == ModItems.gas_mask_m65 //eyesore + || stack.getItem() == ModItems.gas_mask_olde + || stack.getItem() == ModItems.gas_mask_mono) { + ArmorUtil.installGasMaskFilter(stack, new ItemStack(ModItems.gas_mask_filter)); + } + + entity.setCurrentItemOrArmor(slot, stack); + + //Give skeleton AI if it has a gun + if (slot == 0 && entity instanceof EntitySkeleton && pool == slotPools.get(0)) { + addFireTask((EntityLiving) entity); + } + } + } + + // these fucking tasks keep stacking on top of themselves + public static void addFireTask(EntityLiving entity) { + entity.setEquipmentDropChance(0, 0); // Prevent dropping guns + + for(Object entry : entity.tasks.taskEntries) { + EntityAITasks.EntityAITaskEntry task = (EntityAITasks.EntityAITaskEntry) entry; + if(task.action instanceof EntityAIFireGun) return; + } + + entity.tasks.addTask(3, new EntityAIFireGun(entity)); + } +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java new file mode 100644 index 000000000..120ea00e8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -0,0 +1,165 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.BlockSkeletonHolder; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ItemEnums; +import com.hbm.items.ModItems; +import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.MobUtil; +import com.hbm.util.Vec3NT; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.function.Consumer; + +public class DungeonSpawnerActions { + + public static HashMap> actions = new HashMap<>(); + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1 || tile.phase == 2) { + if (tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for (int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if (mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if (tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if (te instanceof BlockSkeletonHolder.TileEntitySkeletonHolder) { + BlockSkeletonHolder.TileEntitySkeletonHolder skeleton = (BlockSkeletonHolder.TileEntitySkeletonHolder) te; + if (world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, ItemEnums.EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; + + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0) return; + + //from explosionChaos because i cannot be assed + int r = 4; + int r2 = r * r; + int r22 = r2 / 2; + + for (int xx = -r; xx < r; xx++) { + int X = xx + x; + int XX = xx * xx; + for (int yy = -r; yy < r; yy++) { + int Y = yy + y; + int YY = XX + yy * yy; + for (int zz = -r; zz < r; zz++) { + int Z = zz + z; + int ZZ = YY + zz * zz; + if (ZZ < r22) { + + if (world.getBlock(X, Y, Z).getExplosionResistance(null) <= 70) { + EntityFallingBlockNT entityfallingblock = new EntityFallingBlockNT(world, X + 0.5, Y + 0.5, Z + 0.5, world.getBlock(X, Y, Z), world.getBlockMetadata(X, Y, Z)); + world.spawnEntityInWorld(entityfallingblock); + } + } + } + } + } + world.setBlock(x, y, z, ModBlocks.block_steel); + + }; + + public static Consumer FODDER_WAVE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if (tile.phase == 1) { + Vec3NT vec = new Vec3NT(5, 0, 0); + for (int i = 0; i < 10; i++) { + EntityZombie mob = new EntityZombie(world); + for (int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + if (mob.getCanSpawnHere()) { + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); + } + world.setBlock(x, y, z, ModBlocks.block_steel); + } + }; + + public static Consumer PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 2){ + world.setBlock(x,y,z, ModBlocks.crate_steel); + + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + world.spawnEntityInWorld(blitz); + + TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); + ((IInventory)crate).setInventorySlotContents(15, new ItemStack(ModItems.gun_bolter)); + } + }; + + public static List getActionNames(){ + return new ArrayList<>(actions.keySet()); + } + + //register new actions here + static{ + actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("PUZZLE_TEST", PUZZLE_TEST); + } + + + +} diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java new file mode 100644 index 000000000..0a634c271 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -0,0 +1,91 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockPedestal; +import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.items.ModItems; +import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.Function; + +public class DungeonSpawnerConditions { + + public static HashMap> conditions = new HashMap<>(); + + public static Function ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Function PLAYER_CUBE_5 = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); + }; + + public static Function REDSTONE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + return world.isBlockIndirectlyGettingPowered(x,y,z); + }; + + public static Function PUZZLE_TEST = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase == 0 && world.isBlockIndirectlyGettingPowered(x,y,z)){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText("Find a " + EnumChatFormatting.GOLD + "great" + EnumChatFormatting.RESET + " ancient weapon, of questionable use in the modern age")); + world.setBlock(x,y + 1,z, ModBlocks.pedestal); + return true; + } + + TileEntity pedestal = world.getTileEntity(x,y + 1,z); + + return tile.phase == 1 + && pedestal instanceof BlockPedestal.TileEntityPedestal + && ((BlockPedestal.TileEntityPedestal) pedestal).item != null + && ((BlockPedestal.TileEntityPedestal) pedestal).item.getItem() == ModItems.big_sword; + }; + + public static List getConditionNames(){ + return new ArrayList<>(conditions.keySet()); + } + + //register new conditions here + static { + conditions.put("ABERRATOR", ABERRATOR); + conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); + conditions.put("REDSTONE", REDSTONE); + conditions.put("PUZZLE_TEST", PUZZLE_TEST); + } + +} diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 74c5a343b..0a90eddf7 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6061,6 +6061,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) +tile.wand_spawner.name=Structure Wand Block (Actions) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..4561c8e4ee9f3dd2e6c8eec19ef31a27d2648ff9 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y{_(X4)An#RtPA{Ps_|nWnj=a zKXsz5$6*JVqw&E@l|a-W%a>xlG`;@R5{R?fFL z;433wnwqFGpJ4YgVkT+9sL~*vB^mLr9?6&f^(@kSqSZVx znK3kDLahA{=|AtTX`S(@_H^WYQCm2tzffTVx5?|i&$VwX&I%v+&lB@9w|*<*nfgg_ z`PmPZ6AGkv?8wVLC0DSMxyMFwljiP8^Opr^FuYIy;$xZcLhMES=c??tkH0XU2nauI ze&C>@LEw@%U-iDfd;R9^`T9Hm6#gldvJwM)?eMhjJ*_rJuVDT&< z8w5Nh85v#x6Az3=vy=g-e*!xL3s9wjk+A{e0*I+#p8&j=q`{-;D&Q<|NI+#KBO8a{j>Z{fj&lwkU|{e$#-X$8k{QTt44$rj JF6*2UngE?A_U`}y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4788b84883581058c6fdf5525b3239d0e888f352 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPL>Y|3BPd`_OrtHz2RrJEzLct)l-`jtSimUq^_o?J^%8- zSW0o$i^bPA?74H~ipQKyj~`Ft+Ip{KrOrR|SHj-&SVebzSTMEt^P%oTe^>vU^GNn# z$JQK`7XMc3*qsYL?7eiBX}^Xa>zb8kI;8t~Io(^nhH%bS&C%VxtzdmY^r149_}Q8T zP9J9_S#M7Idnb7BhP;zA=LPLL6XqtF+~ir}6Xr2l(SQ1yJ`Fj;oBh*1ZfE)DSvd2N zS8`|a3>`DK2kw6lzR%m6;$N<~QjaUtf8YOWd=GVh-1_qOyz~A4R!tX_V=P?jzcH}g zbG@&VmHYd`2EO#^u4nJGedf)mJ0ZDF&_i)%lo988^-sQ=FI4cFer~;2_sw!&^NteJ zI@aCQ7bZ@6(`xj7o!;BG=ZzifUG_6Bo>sK$v&Z|*z)0Z?@CkAKFQfkd|9>D)x_ylg zNU*>ovY3H^TNs2H8D`Cq018T!xJHx&=ckpFCl;kL1SDqWmFW4ohA5co8R}U`XTDki zRMV3h;hE;?sl~tn=U5aI;JVVC4_S{flPBx7sn8Z z%gG4|0xV1lM>ROum?9(`oIC`Va7jCRdIWMFVqh|G_VDx+T*Ri*utcI?R3P2J0O%k? Wj>Vsvd|H4;FnGH9xvX Date: Sun, 29 Jun 2025 19:11:39 -0400 Subject: [PATCH 14/45] the gob block From 274995ebd6ec87b23b4e8939baf70013f954cd80 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 15/45] copy tool support and working directional offsets --- .../hbm/blocks/generic/BlockWandSpawner.java | 11 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 4 +++ .../world/gen/util/DungeonSpawnerActions.java | 33 +++++++++++++++++- .../hbm/textures/blocks/wand_spawner_top.png | Bin 740 -> 743 bytes 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index fdfca7689..0508002d7 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -33,6 +33,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; @@ -78,9 +79,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT if (i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); if (i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + ForgeDirection dir = ForgeDirection.UNKNOWN; + switch(i){ + case 0: dir = ForgeDirection.SOUTH;break; + case 1: dir = ForgeDirection.WEST; break; + case 2: dir = ForgeDirection.NORTH;break; + case 3: dir = ForgeDirection.EAST; break; + } TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = i; + ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } @Override @@ -193,6 +201,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.direction = ForgeDirection.getOrientation(placedRotation); } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index ffbb14239..41fa907b5 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -20,6 +20,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,6 +45,7 @@ public class DungeonSpawner extends BlockContainer { public Function condition; public Consumer action; + public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override public void updateEntity() { @@ -74,6 +76,7 @@ public class DungeonSpawner extends BlockContainer { nbt.setInteger("phase", phase); nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); + nbt.setInteger("direction", direction.ordinal()); } @Override @@ -81,6 +84,7 @@ public class DungeonSpawner extends BlockContainer { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 120ea00e8..1e32d9dc7 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -5,6 +5,7 @@ import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; @@ -12,6 +13,7 @@ import com.hbm.main.ModEventHandler; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -21,7 +23,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.HashMap; @@ -140,7 +145,7 @@ public class DungeonSpawnerActions { if(tile.phase == 2){ world.setBlock(x,y,z, ModBlocks.crate_steel); - EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 1, z); + EntityLightningBolt blitz = new EntityLightningBolt(world, x, world.getHeightValue(x, z) + 2, z); world.spawnEntityInWorld(blitz); TileEntityCrateBase crate = (TileEntityCrateBase) world.getTileEntity(x,y,z); @@ -148,6 +153,31 @@ public class DungeonSpawnerActions { } }; + public static Consumer MISSILE_STRIKE = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + if(tile.phase != 1) return; + + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[COMMAND UNIT]"+ EnumChatFormatting.RESET + " Missile Fired")); + + ForgeDirection parallel = tile.direction.getRotation(ForgeDirection.UP); + + EntityMissileTier2.EntityMissileStrong missile = + new EntityMissileTier2.EntityMissileStrong( + world, + x + tile.direction.offsetX * 300, + 200, + z + tile.direction.offsetZ * 300, + x + parallel.offsetX * 30 + tile.direction.offsetX * 30, + z + parallel.offsetZ * 30 + tile.direction.offsetZ * 30); + WorldUtil.loadAndSpawnEntityInWorld(missile); + + world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -158,6 +188,7 @@ public class DungeonSpawnerActions { actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); + actions.put("MISSILE_STRIKE", MISSILE_STRIKE); } diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png index 4788b84883581058c6fdf5525b3239d0e888f352..65e3106a96f970891be895a960ccfb53a60b3915 100644 GIT binary patch delta 87 zcmaFD`kZyc3?_doPZ!4!iOb0e2?8uk3P&|K*q9Fw delta 84 zcmaFP`h<1E3??6QPZ!4!iOb0e2?8uk3P&|K*q9bP0l+XkK_SqL` From acb01b13e00b00f83477a118baaf2bbcb95fc0ea Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:32:25 -0400 Subject: [PATCH 16/45] copy tool support and working directional offsets From 714a5298a976fa26ef4708d950c966a6a16c2e04 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 17/45] disguises for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 65 ++++++++++++++++++- .../hbm/blocks/generic/DungeonSpawner.java | 51 +++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 0508002d7..6d4a6f8a3 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,14 +16,18 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -91,6 +95,30 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if (stack != null && stack.getItem() instanceof ItemBlock && !player.isSneaking()) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if (block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityWandSpawner){ + TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; + spawner.disguise = block; + spawner.disguiseMeta = stack.getItemDamage() & 15; + return true; + } + } + } + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + @Override public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); @@ -132,10 +160,17 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; - List text = new ArrayList(); + List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + String block; + if(spawner.disguise != null && spawner.disguise != Blocks.air) + block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + else + block = "None"; + + text.add("Disguise Block: " + block); ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -167,9 +202,14 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public int placedRotation; + Block disguise; + int disguiseMeta = -1; + public String actionID = "PHASE_ABERRATOR"; public String conditionID = "ABERRATOR"; + public boolean noDisguise; + @Override public void updateEntity() { if(!worldObj.isRemote) { @@ -202,6 +242,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.actionID = actionID; spawner.conditionID = conditionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); + spawner.disguise = disguise; + spawner.disguiseMeta = disguiseMeta; } } @@ -217,6 +259,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); nbt.setInteger("rotation", placedRotation); + if(disguise != null){ + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } } @Override @@ -225,6 +271,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); placedRotation = nbt.getInteger("rotation"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } @Override @@ -232,6 +282,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + buf.writeInt(Block.getIdFromBlock(disguise)); + buf.writeInt(disguiseMeta); } @Override @@ -239,6 +291,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + disguise = Block.getBlockById(buf.readInt()); + disguiseMeta = buf.readInt(); } @Override @@ -246,6 +300,11 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(disguise != null){ + nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setInteger("disguiseMeta", disguiseMeta); + } + return nbt; } @@ -253,6 +312,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("disguise")){ + disguise = Block.getBlockFromName(nbt.getString("disguise")); + disguiseMeta = nbt.getInteger("disguiseMeta"); + } } } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 41fa907b5..bba6ebfe7 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,18 +7,29 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; +import com.hbm.util.BufferUtil; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; 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.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -33,11 +44,31 @@ public class DungeonSpawner extends BlockContainer { return new TileEntityDungeonSpawner(); } + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityDungeonSpawner){ + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; + if(spawner.disguise != null){ + return spawner.disguise.getIcon(side, spawner.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + + public static class TileEntityDungeonSpawner extends TileEntity { public int phase = 0; public int timer = 0; + public Block disguise; + public int disguiseMeta; + public String conditionID = "ABERRATOR"; //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; @@ -77,6 +108,10 @@ public class DungeonSpawner extends BlockContainer { nbt.setString("conditionID", conditionID); nbt.setString("actionID", actionID); nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } } @Override @@ -85,6 +120,22 @@ public class DungeonSpawner extends BlockContainer { this.phase = nbt.getInteger("phase"); this.conditionID = nbt.getString("conditionID"); this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @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()); } } From 3d77afab1f950d64dca34eff12650311a5defc21 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Tue, 1 Jul 2025 20:11:19 -0400 Subject: [PATCH 18/45] disguises for the logic block From 21efc6b61cc1c2f79765020a831bb39553094ff8 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 19/45] Interactions for the logic block --- .../hbm/blocks/generic/BlockWandSpawner.java | 32 +++++- .../hbm/blocks/generic/DungeonSpawner.java | 34 +++++- .../world/gen/util/DungeonSpawnerActions.java | 105 ++++++++++++++---- .../gen/util/DungeonSpawnerConditions.java | 7 +- .../gen/util/DungeonSpawnerInteractions.java | 80 +++++++++++++ 5 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java index 6d4a6f8a3..b6c042838 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java @@ -16,6 +16,7 @@ import com.hbm.util.i18n.I18nUtil; import com.hbm.world.gen.INBTTileEntityTransformable; import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -146,6 +147,16 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT spawner.conditionID = conditionNames.get(indexC); + return true; + case HAND_DRILL: + List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(spawner.interactionID); + + indexI += player.isSneaking() ? -1 : 1; + indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); + + spawner.interactionID = interactionNames.get(indexI); + return true; default: return false; @@ -163,6 +174,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT List text = new ArrayList<>(); text.add("Action: " + spawner.actionID); text.add("Condition: " + spawner.conditionID); + text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + String block; if(spawner.disguise != null && spawner.disguise != Blocks.air) @@ -171,6 +184,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT block = "None"; text.add("Disguise Block: " + block); + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } @@ -178,7 +192,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add(EnumChatFormatting.GOLD + "Use screwdriver to cycle forwards through the action list, shift click to go back"); list.add(EnumChatFormatting.GOLD + "Use defuser to cycle forwards through the condition list, shift click to go back"); - list.add(EnumChatFormatting.BLUE + "Use a detonator to transform"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to cycle forwards through the interaction list, shift click to go back"); + list.add(EnumChatFormatting.YELLOW + "Use a detonator to transform"); } @Override @@ -206,9 +221,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT int disguiseMeta = -1; public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "ABERRATOR"; - - public boolean noDisguise; + public String conditionID = "EMPTY"; + public String interactionID; @Override public void updateEntity() { @@ -241,6 +255,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; spawner.actionID = actionID; spawner.conditionID = conditionID; + spawner.interactionID = interactionID; spawner.direction = ForgeDirection.getOrientation(placedRotation); spawner.disguise = disguise; spawner.disguiseMeta = disguiseMeta; @@ -258,6 +273,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.writeToNBT(nbt); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + nbt.setString("interactionID", interactionID); nbt.setInteger("rotation", placedRotation); if(disguise != null){ nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); @@ -270,6 +286,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT super.readFromNBT(nbt); actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); placedRotation = nbt.getInteger("rotation"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); @@ -282,6 +299,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT buf.writeInt(placedRotation); BufferUtil.writeString(buf, actionID); BufferUtil.writeString(buf, conditionID); + BufferUtil.writeString(buf, interactionID); buf.writeInt(Block.getIdFromBlock(disguise)); buf.writeInt(disguiseMeta); } @@ -291,6 +309,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT placedRotation = buf.readInt(); actionID = BufferUtil.readString(buf); conditionID = BufferUtil.readString(buf); + interactionID = BufferUtil.readString(buf); disguise = Block.getBlockById(buf.readInt()); disguiseMeta = buf.readInt(); } @@ -300,8 +319,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT NBTTagCompound nbt = new NBTTagCompound(); nbt.setString("actionID", actionID); nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); if(disguise != null){ - nbt.setString("disguise", disguise.getUnlocalizedName()); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); nbt.setInteger("disguiseMeta", disguiseMeta); } @@ -312,6 +333,7 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { actionID = nbt.getString("actionID"); conditionID = nbt.getString("conditionID"); + interactionID = nbt.getString("interactionID"); if(nbt.hasKey("disguise")){ disguise = Block.getBlockFromName(nbt.getString("disguise")); disguiseMeta = nbt.getInteger("disguiseMeta"); diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index bba6ebfe7..52dbb6099 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -12,6 +12,7 @@ import com.hbm.world.gen.util.DungeonSpawnerActions; import com.hbm.world.gen.util.DungeonSpawnerConditions; import com.hbm.util.Vec3NT; +import com.hbm.world.gen.util.DungeonSpawnerInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -59,22 +60,38 @@ public class DungeonSpawner extends BlockContainer { return super.getIcon(world, x, y, z, side); } + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { + ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } public static class TileEntityDungeonSpawner extends TileEntity { + //phase is incremented per condition check, timer counts since last condition check by default public int phase = 0; public int timer = 0; public Block disguise; public int disguiseMeta; + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ public String conditionID = "ABERRATOR"; - //actions always get called before conditions, use the phase timer in order to control behavior via condition public String actionID = "ABERRATOR"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; public Function condition; public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; public ForgeDirection direction = ForgeDirection.UNKNOWN; @Override @@ -87,6 +104,10 @@ public class DungeonSpawner extends BlockContainer { if(condition == null){ condition = DungeonSpawnerConditions.conditions.get(conditionID); } + if(interaction == null && interactionID != null){ + interaction = DungeonSpawnerInteractions.interactions.get(interactionID); + } + if(action == null || condition == null){ worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); return; @@ -105,8 +126,12 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - nbt.setString("conditionID", conditionID); + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + nbt.setInteger("direction", direction.ordinal()); if(disguise != null){ nbt.setInteger("disguiseMeta", disguiseMeta); @@ -118,8 +143,13 @@ public class DungeonSpawner extends BlockContainer { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + if(nbt.hasKey("disguise")){ disguiseMeta = nbt.getInteger("disguiseMeta"); disguise = Block.getBlockFromName(nbt.getString("disguise")); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index 1e32d9dc7..fee835c2e 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -1,7 +1,7 @@ package com.hbm.world.gen.util; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.entity.item.EntityFallingBlockNT; @@ -9,34 +9,30 @@ import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums; import com.hbm.items.ModItems; -import com.hbm.main.ModEventHandler; +import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.tileentity.machine.storage.TileEntityCrateBase; +import com.hbm.util.ContaminationUtil; import com.hbm.util.MobUtil; import com.hbm.util.Vec3NT; import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.*; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.function.Consumer; public class DungeonSpawnerActions { - public static HashMap> actions = new HashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -122,14 +118,10 @@ public class DungeonSpawnerActions { Vec3NT vec = new Vec3NT(5, 0, 0); for (int i = 0; i < 10; i++) { EntityZombie mob = new EntityZombie(world); - for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); - MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); - if (mob.getCanSpawnHere()) { - world.spawnEntityInWorld(mob); - break; - } - } + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue(x,z), z + 0.5 + vec.zCoord, i * 36F, 0); + MobUtil.assignItemsToEntity(mob, MobUtil.slotPoolAdv, new Random()); + world.spawnEntityInWorld(mob); + vec.rotateAroundYDeg(36D); } world.setBlock(x, y, z, ModBlocks.block_steel); @@ -178,6 +170,78 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + + ForgeDirection direction = tile.direction.getOpposite(); + ForgeDirection rot = direction.getRotation(ForgeDirection.UP); + + AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(x - rot.offsetX, y - 1, z - rot.offsetZ, x + rot.offsetX + direction.offsetX * 15, y + 1, z + rot.offsetZ + direction.offsetZ * 15).expand(2,2,2); + + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, bb); + + for(EntityLivingBase e : entities) { + + Vec3 vec = Vec3.createVectorHelper(e.posX - (x + 0.5), (e.posY + e.getEyeHeight()) - (y + 0.5), e.posZ - (z + 0.5)); + double len = vec.lengthVector(); + vec = vec.normalize(); + + len = Math.max(len,1D); + + float res = 0; + + for(int i = 1; i < len; i++) { + + int ix = (int)Math.floor(x + 0.5 + vec.xCoord * i); + int iy = (int)Math.floor(y + 0.5 + vec.yCoord * i); + int iz = (int)Math.floor(z + 0.5 + vec.zCoord * i); + + res += world.getBlock(ix, iy, iz).getExplosionResistance(null); + } + + if(res < 1) + res = 1; + + float eRads = 100F; + eRads /= (float)res; + eRads /= (float)(len * len); + + ContaminationUtil.contaminate(e, ContaminationUtil.HazardType.RADIATION, ContaminationUtil.ContaminationType.HAZMAT2, eRads); + } + + if (tile.phase == 2 && tile.timer > 40){ + world.getClosestPlayer(x,y,z, 25).addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Diagnostics found containment failure, commencing lockdown")); + + for(int i = 1; i < 20; i++) { + int checkX, checkY, checkZ; + checkX = x + direction.offsetX * i; + checkY = y + 1; + checkZ = z + direction.offsetZ * i; + Block block = world.getBlock(checkX, checkY,checkZ); + TileEntity te = null; + if(block instanceof BlockDummyable){ + int[] coreCoords = ((BlockDummyable) block).findCore(world,checkX,checkY,checkZ); + te = world.getTileEntity(coreCoords[0], coreCoords[1], coreCoords[2]); + } + + if (te instanceof TileEntityDoorGeneric) { + TileEntityDoorGeneric door = (TileEntityDoorGeneric) te; + door.setPins(456); + door.close(); + door.lock(); + break; + } + } + + tile.phase = 3; + } + }; + public static List getActionNames(){ return new ArrayList<>(actions.keySet()); } @@ -189,6 +253,7 @@ public class DungeonSpawnerActions { actions.put("FODDER_WAVE", FODDER_WAVE); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); + actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 0a634c271..83dd773e8 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -15,12 +15,16 @@ import net.minecraft.world.World; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; public class DungeonSpawnerConditions { - public static HashMap> conditions = new HashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); + + /**For use with interactions, for having them handle all conditional tasks*/ + public static Function EMPTY = (tile) -> false; public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); @@ -82,6 +86,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); conditions.put("REDSTONE", REDSTONE); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java new file mode 100644 index 000000000..32c19b81d --- /dev/null +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java @@ -0,0 +1,80 @@ +package com.hbm.world.gen.util; + +import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.items.ModItems; +import com.hbm.potion.HbmPotion; +import com.hbm.tileentity.TileEntityDoorGeneric; +import com.hbm.util.Vec3NT; +import com.hbm.world.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/**Interactions are called when the player right-clicks the block**/ +public class DungeonSpawnerInteractions { + + /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, + * in that order **/ + public static LinkedHashMap> interactions = new LinkedHashMap<>(); + + public static Consumer TEST = (array) -> { + World world = (World) array[0]; + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + int x = (int) array[2]; + int y = (int) array[3]; + int z = (int) array[4]; + EntityPlayer player = (EntityPlayer) array[5]; + int side = (int) array[6]; + + if(spawner.phase > 1) return; + + if(player.getHeldItem() != null) + player.getHeldItem().stackSize--; + + spawner.phase++; + }; + + public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { + TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + EntityPlayer player = (EntityPlayer) array[5]; + + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ + player.getHeldItem().stackSize--; + player.addChatMessage(new ChatComponentText( + EnumChatFormatting.LIGHT_PURPLE + "[RAD CONTAINMENT SYSTEM]" + + EnumChatFormatting.RESET + " Radiation treatment administered")); + player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); + player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); + spawner.phase = 2; + spawner.timer = 0; + } + }; + + + + public static List getInteractionNames(){ + return new ArrayList<>(interactions.keySet()); + } + + //register new interactions here + static{ + interactions.put("TEST", TEST); + interactions.put("RADAWAY_INJECTOR", RAD_CONTAINMENT_SYSTEM); + } + + + +} From 541c6a1c997d51a9cd5f9f4c94f8b207c1283ce3 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 20/45] Interactions for the logic block --- src/main/resources/assets/hbm/lang/en_US.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 0a90eddf7..dcb6d68b3 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,6 +5279,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain +tile.dungeon_spawner.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port From 603cc10696deb39faf0c580a850cd400eb34d108 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:09:09 -0400 Subject: [PATCH 21/45] Interactions for the logic block From c33b962043c533925012d20ef69ec6bc806c301b Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:04:32 -0400 Subject: [PATCH 22/45] misc fix --- .../com/hbm/entity/mob/EntityUndeadSoldier.java | 14 ++++++++++---- .../hbm/world/gen/util/DungeonSpawnerActions.java | 12 +++++++++--- .../world/gen/util/DungeonSpawnerConditions.java | 6 ++++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java index 1a18c36c7..f2b042085 100644 --- a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -16,10 +16,11 @@ 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.EnumDifficulty; 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; @@ -66,7 +67,7 @@ public class EntityUndeadSoldier extends EntityMob { this.setCurrentItemOrArmor(3, new ItemStack(ModItems.taurun_plate)); this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); - + int gun = rand.nextInt(5); if(gun == 0) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); if(gun == 1) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_light_revolver)); @@ -74,7 +75,7 @@ public class EntityUndeadSoldier extends EntityMob { if(gun == 3) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_maresleg)); if(gun == 4) this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_greasegun)); } - + @Override protected String getLivingSound() { byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); @@ -110,7 +111,12 @@ public class EntityUndeadSoldier extends EntityMob { public EnumCreatureAttribute getCreatureAttribute() { return EnumCreatureAttribute.UNDEAD; } - + + @Override + public boolean getCanSpawnHere() { + return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); + } + @Override protected void dropFewItems(boolean player, int loot) { } @Override protected void dropEquipment(boolean player, int loot) { } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java index fee835c2e..252bc543b 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java @@ -40,19 +40,25 @@ public class DungeonSpawnerActions { int y = tile.yCoord; int z = tile.zCoord; if (tile.phase == 1 || tile.phase == 2) { + tile.player = world.getClosestPlayer(x,y,z, 25); if (tile.timer == 0) { - Vec3NT vec = new Vec3NT(10, 0, 0); + Vec3NT vec = new Vec3NT(20, 0, 0); for (int i = 0; i < 10; i++) { + + if(vec.xCoord > 8) vec.xCoord += world.rand.nextInt(10) - 5; + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); for (int j = 0; j < 7; j++) { - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, world.getHeightValue((int) (x + 0.5 + vec.xCoord),(int) (z + 0.5 + vec.zCoord)), z + 0.5 + vec.zCoord, i * 36F, 0); if (mob.getCanSpawnHere()) { mob.onSpawnWithEgg(null); + if(tile.player != null){ + mob.setTarget(tile.player); + } world.spawnEntityInWorld(mob); break; } } - vec.rotateAroundYDeg(36D); } } diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java index 83dd773e8..1e0cc9d5a 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java @@ -32,13 +32,15 @@ public class DungeonSpawnerConditions { int x = tile.xCoord; int y = tile.yCoord; int z = tile.zCoord; + + boolean aoeCheck = !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(10, 10, 10)).isEmpty(); if(tile.phase == 0) { if(world.getTotalWorldTime() % 20 != 0) return false; - return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + return aoeCheck; } if(tile.phase < 3) { if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty() && aoeCheck; } return false; }; From e7ebc7dd07846f847f18d40937218fce9c8d0d67 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:03:48 -0400 Subject: [PATCH 23/45] thunder fire all your generation --- src/main/java/com/hbm/blocks/ModBlocks.java | 14 +- ...ckWandSpawner.java => BlockWandLogic.java} | 100 ++++----- .../hbm/blocks/generic/DungeonSpawner.java | 191 +++++++----------- .../com/hbm/blocks/generic/LogicBlock.java | 162 +++++++++++++++ .../hbm/tileentity/TileEntityDoorGeneric.java | 13 +- .../java/com/hbm/tileentity/TileMappings.java | 6 +- ...nerActions.java => LogicBlockActions.java} | 22 +- ...ditions.java => LogicBlockConditions.java} | 18 +- ...tions.java => LogicBlockInteractions.java} | 26 +-- src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/textures/blocks/logic_block.png | Bin 0 -> 910 bytes .../{wand_spawner.png => wand_logic.png} | Bin ...and_spawner_top.png => wand_logic_top.png} | Bin 13 files changed, 347 insertions(+), 209 deletions(-) rename src/main/java/com/hbm/blocks/generic/{BlockWandSpawner.java => BlockWandLogic.java} (74%) create mode 100644 src/main/java/com/hbm/blocks/generic/LogicBlock.java rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerActions.java => LogicBlockActions.java} (91%) rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerConditions.java => LogicBlockConditions.java} (79%) rename src/main/java/com/hbm/world/gen/util/{DungeonSpawnerInteractions.java => LogicBlockInteractions.java} (73%) create mode 100644 src/main/resources/assets/hbm/textures/blocks/logic_block.png rename src/main/resources/assets/hbm/textures/blocks/{wand_spawner.png => wand_logic.png} (100%) rename src/main/resources/assets/hbm/textures/blocks/{wand_spawner_top.png => wand_logic_top.png} (100%) diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index f69f85497..5f3de7f83 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1243,7 +1243,9 @@ public class ModBlocks { public static Block wand_air; public static Block wand_loot; public static Block wand_jigsaw; - public static Block wand_spawner; + public static Block wand_logic; + + public static Block logic_block; public static Material materialGas = new MaterialGas(); @@ -1978,7 +1980,7 @@ public class ModBlocks { ladder_cobalt = new BlockNTMLadder().setBlockName("ladder_cobalt").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_cobalt"); ladder_steel = new BlockNTMLadder().setBlockName("ladder_steel").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_steel"); ladder_tungsten = new BlockNTMLadder().setBlockName("ladder_tungsten").setHardness(0.25F).setResistance(2.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":ladder_tungsten"); - + trapdoor_steel = new BlockNTMTrapdoor(Material.iron).setBlockName("trapdoor_steel").setHardness(3F).setResistance(8.0F).setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":trapdoor_steel"); barrel_plastic = new BlockFluidBarrel(Material.iron, 12000).setBlockName("barrel_plastic").setStepSound(Block.soundTypeStone).setHardness(2.0F).setResistance(5.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":barrel_plastic"); @@ -2397,7 +2399,9 @@ public class ModBlocks { wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); - wand_spawner = new BlockWandSpawner().setBlockName("wand_spawner").setBlockTextureName(RefStrings.MODID + ":wand_spawner"); + wand_logic = new BlockWandLogic().setBlockName("wand_logic").setBlockTextureName(RefStrings.MODID + ":wand_logic"); + + logic_block = new LogicBlock().setBlockName("logic_block").setBlockTextureName(RefStrings.MODID + ":logic_block"); } @@ -3545,7 +3549,9 @@ public class ModBlocks { register(wand_air); register(wand_loot); register(wand_jigsaw); - register(wand_spawner); + register(wand_logic); + + register(logic_block); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java similarity index 74% rename from src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java rename to src/main/java/com/hbm/blocks/generic/BlockWandLogic.java index b6c042838..01d8df298 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLogic.java @@ -13,10 +13,10 @@ import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.i18n.I18nUtil; +import com.hbm.world.gen.util.LogicBlockActions; import com.hbm.world.gen.INBTTileEntityTransformable; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -43,19 +43,19 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.List; -public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { +public class BlockWandLogic extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation, IBomb { @SideOnly(Side.CLIENT) protected IIcon iconTop; - public BlockWandSpawner() { + public BlockWandLogic() { super(Material.iron); } @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { - this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner"); - this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_spawner_top"); + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_logic_top"); } @Override @@ -92,8 +92,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT case 3: dir = ForgeDirection.EAST; break; } TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof TileEntityWandSpawner) - ((TileEntityWandSpawner)te).placedRotation = dir.ordinal(); + if(te instanceof TileEntityWandLogic) + ((TileEntityWandLogic)te).placedRotation = dir.ordinal(); } @Override @@ -109,10 +109,10 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT TileEntity tile = world.getTileEntity(x, y, z); - if(tile instanceof TileEntityWandSpawner){ - TileEntityWandSpawner spawner = (TileEntityWandSpawner) tile; - spawner.disguise = block; - spawner.disguiseMeta = stack.getItemDamage() & 15; + if(tile instanceof TileEntityWandLogic){ + TileEntityWandLogic logic = (TileEntityWandLogic) tile; + logic.disguise = block; + logic.disguiseMeta = stack.getItemDamage() & 15; return true; } } @@ -124,38 +124,38 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return false; + if(!(te instanceof TileEntityWandLogic)) return false; - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + TileEntityWandLogic logic = (TileEntityWandLogic) te; switch(tool) { case SCREWDRIVER: - List actionNames = DungeonSpawnerActions.getActionNames(); - int indexA = actionNames.indexOf(spawner.actionID); + List actionNames = LogicBlockActions.getActionNames(); + int indexA = actionNames.indexOf(logic.actionID); indexA += player.isSneaking() ? -1 : 1; indexA = MathHelper.clamp_int(indexA, 0, actionNames.size() - 1); - spawner.actionID = actionNames.get(indexA); + logic.actionID = actionNames.get(indexA); return true; case DEFUSER: - List conditionNames = DungeonSpawnerConditions.getConditionNames(); - int indexC = conditionNames.indexOf(spawner.conditionID); + List conditionNames = LogicBlockConditions.getConditionNames(); + int indexC = conditionNames.indexOf(logic.conditionID); indexC += player.isSneaking() ? -1 : 1; indexC = MathHelper.clamp_int(indexC, 0, conditionNames.size() - 1); - spawner.conditionID = conditionNames.get(indexC); + logic.conditionID = conditionNames.get(indexC); return true; case HAND_DRILL: - List interactionNames = DungeonSpawnerInteractions.getInteractionNames(); - int indexI = interactionNames.indexOf(spawner.interactionID); + List interactionNames = LogicBlockInteractions.getInteractionNames(); + int indexI = interactionNames.indexOf(logic.interactionID); indexI += player.isSneaking() ? -1 : 1; indexI = MathHelper.clamp_int(indexI, 0, interactionNames.size() - 1); - spawner.interactionID = interactionNames.get(indexI); + logic.interactionID = interactionNames.get(indexI); return true; @@ -167,19 +167,19 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return; + if(!(te instanceof TileEntityWandLogic)) return; - TileEntityWandSpawner spawner = (TileEntityWandSpawner) te; + TileEntityWandLogic logic = (TileEntityWandLogic) te; List text = new ArrayList<>(); - text.add("Action: " + spawner.actionID); - text.add("Condition: " + spawner.conditionID); - text.add("Interaction: " + (spawner.interactionID != null ? spawner.interactionID : "None")); + text.add("Action: " + logic.actionID); + text.add("Condition: " + logic.conditionID); + text.add("Interaction: " + (logic.interactionID != null ? logic.interactionID : "None")); String block; - if(spawner.disguise != null && spawner.disguise != Blocks.air) - block = I18nUtil.resolveKey(spawner.disguise.getUnlocalizedName() + ".name"); + if(logic.disguise != null && logic.disguise != Blocks.air) + block = I18nUtil.resolveKey(logic.disguise.getUnlocalizedName() + ".name"); else block = "None"; @@ -198,21 +198,21 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT @Override public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityWandSpawner(); + return new TileEntityWandLogic(); } @Override public BombReturnCode explode(World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); - if(!(te instanceof TileEntityWandSpawner)) return null; + if(!(te instanceof TileEntityWandLogic)) return null; - ((TileEntityWandSpawner) te).triggerReplace = true; + ((TileEntityWandLogic) te).triggerReplace = true; return BombReturnCode.TRIGGERED; } - public static class TileEntityWandSpawner extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { + public static class TileEntityWandLogic extends TileEntityLoadedBase implements INBTTileEntityTransformable, ICopiable { private boolean triggerReplace; public int placedRotation; @@ -220,8 +220,8 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT Block disguise; int disguiseMeta = -1; - public String actionID = "PHASE_ABERRATOR"; - public String conditionID = "EMPTY"; + public String actionID = "FODDER_WAVE"; + public String conditionID = "PLAYER_CUBE_5"; public String interactionID; @Override @@ -237,28 +237,28 @@ public class BlockWandSpawner extends BlockContainer implements ILookOverlay, IT } private void replace() { - if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandSpawner)) { - MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a dungeon spawner block but we're doing a TE update as if it is, cancelling!"); + if (!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLogic)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a logic block but we're doing a TE update as if it is, cancelling!"); return; } - worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.dungeon_spawner); + worldObj.setBlock(xCoord,yCoord,zCoord, ModBlocks.logic_block); TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); if(te == null || te instanceof BlockWandLoot.TileEntityWandLoot) { - MainRegistry.logger.warn("TE for dungeon spawner set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); - te = ModBlocks.wand_spawner.createTileEntity(worldObj, 0); + MainRegistry.logger.warn("TE for logic block set incorrectly at: " + xCoord + ", " + yCoord + ", " + zCoord + ". If you're using some sort of world generation mod, report it to the author!"); + te = ModBlocks.wand_logic.createTileEntity(worldObj, 0); worldObj.setTileEntity(xCoord, yCoord, zCoord, te); } - if(te instanceof DungeonSpawner.TileEntityDungeonSpawner){ - DungeonSpawner.TileEntityDungeonSpawner spawner = (DungeonSpawner.TileEntityDungeonSpawner) te; - spawner.actionID = actionID; - spawner.conditionID = conditionID; - spawner.interactionID = interactionID; - spawner.direction = ForgeDirection.getOrientation(placedRotation); - spawner.disguise = disguise; - spawner.disguiseMeta = disguiseMeta; + if(te instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) te; + logic.actionID = actionID; + logic.conditionID = conditionID; + logic.interactionID = interactionID; + logic.direction = ForgeDirection.getOrientation(placedRotation); + logic.disguise = disguise; + logic.disguiseMeta = disguiseMeta; } } diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 52dbb6099..4a6fc10d8 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -7,32 +7,18 @@ import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ModItems; -import com.hbm.util.BufferUtil; -import com.hbm.world.gen.util.DungeonSpawnerActions; -import com.hbm.world.gen.util.DungeonSpawnerConditions; +import com.hbm.util.EnumUtil; import com.hbm.util.Vec3NT; -import com.hbm.world.gen.util.DungeonSpawnerInteractions; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; 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.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; public class DungeonSpawner extends BlockContainer { @@ -44,76 +30,19 @@ public class DungeonSpawner extends BlockContainer { public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityDungeonSpawner(); } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - TileEntity tile = world.getTileEntity(x, y, z); - - if(tile instanceof TileEntityDungeonSpawner){ - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) tile; - if(spawner.disguise != null){ - return spawner.disguise.getIcon(side, spawner.disguiseMeta); - } - } - - return super.getIcon(world, x, y, z, side); - } - - @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - TileEntity te = worldIn.getTileEntity(x, y, z); - if(te instanceof TileEntityDungeonSpawner && ((TileEntityDungeonSpawner) te).interaction != null) { - ((TileEntityDungeonSpawner) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); - return true; - } - - return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); - } - + public static class TileEntityDungeonSpawner extends TileEntity { - - //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; public int timer = 0; - - public Block disguise; - public int disguiseMeta; - - /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ - public String conditionID = "ABERRATOR"; - public String actionID = "ABERRATOR"; - /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ - public String interactionID; - - public Function condition; - public Consumer action; - /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ - public Consumer interaction; - - public EntityPlayer player; - - public ForgeDirection direction = ForgeDirection.UNKNOWN; + public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; + @Override public void updateEntity() { - + if(!worldObj.isRemote) { - if(action == null){ - action = DungeonSpawnerActions.actions.get(actionID); - } - if(condition == null){ - condition = DungeonSpawnerConditions.conditions.get(conditionID); - } - if(interaction == null && interactionID != null){ - interaction = DungeonSpawnerInteractions.interactions.get(interactionID); - } - - if(action == null || condition == null){ - worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); - return; - } - action.accept(this); - if(condition.apply(this)) { + type.phase.accept(this); + if(type.phaseCondition.apply(this)) { phase++; timer = 0; } else { @@ -126,47 +55,83 @@ public class DungeonSpawner extends BlockContainer { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("phase", phase); - - nbt.setString("actionID", actionID); - nbt.setString("conditionID", conditionID); - if(interactionID != null) - nbt.setString("interactionID", interactionID); - - nbt.setInteger("direction", direction.ordinal()); - if(disguise != null){ - nbt.setInteger("disguiseMeta", disguiseMeta); - nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); - } + nbt.setByte("type", (byte) type.ordinal()); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.phase = nbt.getInteger("phase"); - - this.actionID = nbt.getString("actionID"); - this.conditionID = nbt.getString("conditionID"); - if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); - - this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); - - if(nbt.hasKey("disguise")){ - disguiseMeta = nbt.getInteger("disguiseMeta"); - disguise = Block.getBlockFromName(nbt.getString("disguise")); - } - } - - @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()); + this.type = EnumUtil.grabEnumSafely(EnumSpawnerType.class, nbt.getByte("type")); } } + + public static enum EnumSpawnerType { + + ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); + public Function phaseCondition; + public Consumer phase; + + private EnumSpawnerType(Function con, Consumer ph) { + this.phaseCondition = con; + this.phase = ph; + } + } + + public static Function CON_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + if(world.difficultySetting.ordinal() == 0) return false; + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 0) { + if(world.getTotalWorldTime() % 20 != 0) return false; + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); + } + if(tile.phase < 3) { + if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + } + return false; + }; + + public static Consumer PHASE_ABERRATOR = (tile) -> { + World world = tile.getWorldObj(); + int x = tile.xCoord; + int y = tile.yCoord; + int z = tile.zCoord; + if(tile.phase == 1 || tile.phase == 2) { + if(tile.timer == 0) { + Vec3NT vec = new Vec3NT(10, 0, 0); + for(int i = 0; i < 10; i++) { + EntityUndeadSoldier mob = new EntityUndeadSoldier(world); + for(int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if(mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + + vec.rotateAroundYDeg(36D); + } + } + } + if(tile.phase > 2) { + TileEntity te = world.getTileEntity(x, y + 18, z); + if(te instanceof TileEntitySkeletonHolder) { + TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; + if(world.rand.nextInt(5) == 0) { + skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); + } else { + skeleton.item = new ItemStack(ModItems.clay_tablet, 1, 1); + } + skeleton.markDirty(); + world.markBlockForUpdate(x, y + 18, z); + } + world.setBlock(x, y, z, Blocks.obsidian); + } + }; } diff --git a/src/main/java/com/hbm/blocks/generic/LogicBlock.java b/src/main/java/com/hbm/blocks/generic/LogicBlock.java new file mode 100644 index 000000000..462755811 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/LogicBlock.java @@ -0,0 +1,162 @@ +package com.hbm.blocks.generic; + +import com.hbm.world.gen.util.LogicBlockActions; +import com.hbm.world.gen.util.LogicBlockConditions; +import com.hbm.world.gen.util.LogicBlockInteractions; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +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.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class LogicBlock extends BlockContainer { + + public LogicBlock() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new LogicBlock.TileEntityLogicBlock(); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof LogicBlock.TileEntityLogicBlock){ + LogicBlock.TileEntityLogicBlock logicBlock = (LogicBlock.TileEntityLogicBlock) tile; + if(logicBlock.disguise != null){ + return logicBlock.disguise.getIcon(side, logicBlock.disguiseMeta); + } + } + + return super.getIcon(world, x, y, z, side); + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if(te instanceof LogicBlock.TileEntityLogicBlock && ((LogicBlock.TileEntityLogicBlock) te).interaction != null) { + ((LogicBlock.TileEntityLogicBlock) te).interaction.accept(new Object[]{worldIn, te, x, y, z, player, side, subX, subY, subZ}); + return true; + } + + return super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ); + } + + public static class TileEntityLogicBlock extends TileEntity { + + //phase is incremented per condition check, timer counts since last condition check by default + public int phase = 0; + public int timer = 0; + + public Block disguise; + public int disguiseMeta; + + /**Actions always get called before conditions, use the phase and timer variables in order to control behavior via conditions*/ + public String conditionID = "PLAYER_CUBE_5"; + public String actionID = "FODDER_WAVE"; + /**Interactions are called on right click, and passes on the parameters of the right click to consumer*/ + public String interactionID; + + public Function condition; + public Consumer action; + /**Consists of world instance, TileEntity instance, three ints for coordinates, one int for block side, and player instance, in that order **/ + public Consumer interaction; + + public EntityPlayer player; + + public ForgeDirection direction = ForgeDirection.UNKNOWN; + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + if(action == null){ + action = LogicBlockActions.actions.get(actionID); + } + if(condition == null){ + condition = LogicBlockConditions.conditions.get(conditionID); + } + if(interaction == null && interactionID != null){ + interaction = LogicBlockInteractions.interactions.get(interactionID); + } + + if(action == null || condition == null){ + worldObj.setBlock(xCoord,yCoord,zCoord, Blocks.air); + return; + } + action.accept(this); + if(condition.apply(this)) { + phase++; + timer = 0; + } else { + timer++; + } + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("phase", phase); + + nbt.setString("actionID", actionID); + nbt.setString("conditionID", conditionID); + if(interactionID != null) + nbt.setString("interactionID", interactionID); + + nbt.setInteger("direction", direction.ordinal()); + if(disguise != null){ + nbt.setInteger("disguiseMeta", disguiseMeta); + nbt.setString("disguise", GameRegistry.findUniqueIdentifierFor(disguise).toString()); + } + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.phase = nbt.getInteger("phase"); + + this.actionID = nbt.getString("actionID"); + this.conditionID = nbt.getString("conditionID"); + if(nbt.hasKey("interactionID")) this.interactionID = nbt.getString("interactionID"); + + this.direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + + if(nbt.hasKey("disguise")){ + disguiseMeta = nbt.getInteger("disguiseMeta"); + disguise = Block.getBlockFromName(nbt.getString("disguise")); + } + } + + @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()); + } + } + +} diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 9b8751d05..e460bc08b 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -21,7 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDoorGeneric extends TileEntityLockableBase { +public class TileEntityDoorGeneric extends TileEntityLockableBase { //0: closed, 1: open, 2: closing, 3: opening public byte state = 0; @@ -318,6 +318,15 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { return true; } + /**Useful for logic block interactions, as a way to close/open doors**/ + public void open(){ + if(state == 0) state = 3; + } + + public void close() { + if(state == 1) state = 2; + } + @Override public AxisAlignedBB getRenderBoundingBox() { return INFINITE_EXTENT_AABB; @@ -404,4 +413,4 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f688059be..1c938ab18 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -19,8 +19,9 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; -import com.hbm.blocks.generic.BlockWandSpawner.TileEntityWandSpawner; +import com.hbm.blocks.generic.BlockWandLogic.TileEntityWandLogic; import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; @@ -209,6 +210,7 @@ public class TileMappings { put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); put(TileEntitySkeletonHolder.class, "tileentity_ntm_skeleton"); put(TileEntityDungeonSpawner.class, "tileentity_ntm_dungeon_spawner"); + put(LogicBlock.TileEntityLogicBlock.class, "tileentity_ntm_logic_block"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); put(TileEntitySnowglobe.class, "tileentity_ntm_snowglobe"); put(TileEntityPlushie.class, "tileentity_ntm_plushie"); @@ -237,7 +239,7 @@ public class TileMappings { put(TileEntityWandLoot.class, "tileentity_wand_loot"); put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); - put(TileEntityWandSpawner.class, "tileentity_wand_spawner"); + put(TileEntityWandLogic.class, "tileentity_wand_spawner"); putNetwork(); putBombs(); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java similarity index 91% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index 252bc543b..2b3682c7c 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -4,6 +4,7 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockSkeletonHolder; import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.entity.missile.EntityMissileTier2; import com.hbm.entity.mob.EntityUndeadSoldier; @@ -30,11 +31,11 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.*; import java.util.function.Consumer; -public class DungeonSpawnerActions { +public class LogicBlockActions { - public static LinkedHashMap> actions = new LinkedHashMap<>(); + public static LinkedHashMap> actions = new LinkedHashMap<>(); - public static Consumer PHASE_ABERRATOR = (tile) -> { + public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -79,7 +80,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { + public static Consumer COLLAPSE_ROOF_RAD_5 = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -115,7 +116,7 @@ public class DungeonSpawnerActions { }; - public static Consumer FODDER_WAVE = (tile) -> { + public static Consumer FODDER_WAVE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -134,7 +135,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer PUZZLE_TEST = (tile) -> { + public static Consumer PUZZLE_TEST = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -151,7 +152,7 @@ public class DungeonSpawnerActions { } }; - public static Consumer MISSILE_STRIKE = (tile) -> { + public static Consumer MISSILE_STRIKE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -176,7 +177,7 @@ public class DungeonSpawnerActions { world.setBlock(x,y,z, ModBlocks.block_electrical_scrap); }; - public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { + public static Consumer RAD_CONTAINMENT_SYSTEM = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -254,9 +255,10 @@ public class DungeonSpawnerActions { //register new actions here static{ - actions.put("PHASE_ABERRATOR", PHASE_ABERRATOR); - actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); + //example actions actions.put("FODDER_WAVE", FODDER_WAVE); + actions.put("ABERRATOR", PHASE_ABERRATOR); + actions.put("COLLAPSE_ROOF_RAD_5", COLLAPSE_ROOF_RAD_5); actions.put("PUZZLE_TEST", PUZZLE_TEST); actions.put("MISSILE_STRIKE", MISSILE_STRIKE); actions.put("IRRADIATE_ENTITIES_AOE", RAD_CONTAINMENT_SYSTEM); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java similarity index 79% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java index 1e0cc9d5a..5065a38fd 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerConditions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -3,9 +3,9 @@ package com.hbm.world.gen.util; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockPedestal; import com.hbm.blocks.generic.DungeonSpawner; +import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ModItems; -import com.hbm.tileentity.machine.storage.TileEntityCrateBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; @@ -14,19 +14,18 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.function.Function; -public class DungeonSpawnerConditions { +public class LogicBlockConditions { - public static LinkedHashMap> conditions = new LinkedHashMap<>(); + public static LinkedHashMap> conditions = new LinkedHashMap<>(); /**For use with interactions, for having them handle all conditional tasks*/ - public static Function EMPTY = (tile) -> false; + public static Function EMPTY = (tile) -> false; - public static Function ABERRATOR = (tile) -> { + public static Function ABERRATOR = (tile) -> { World world = tile.getWorldObj(); if(world.difficultySetting.ordinal() == 0) return false; int x = tile.xCoord; @@ -45,7 +44,7 @@ public class DungeonSpawnerConditions { return false; }; - public static Function PLAYER_CUBE_5 = (tile) -> { + public static Function PLAYER_CUBE_5 = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -53,7 +52,7 @@ public class DungeonSpawnerConditions { return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(5, 5, 5)).isEmpty(); }; - public static Function REDSTONE = (tile) -> { + public static Function REDSTONE = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -62,7 +61,7 @@ public class DungeonSpawnerConditions { return world.isBlockIndirectlyGettingPowered(x,y,z); }; - public static Function PUZZLE_TEST = (tile) -> { + public static Function PUZZLE_TEST = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -88,6 +87,7 @@ public class DungeonSpawnerConditions { //register new conditions here static { + //example conditions conditions.put("EMPTY", EMPTY); conditions.put("ABERRATOR", ABERRATOR); conditions.put("PLAYER_CUBE_5", PLAYER_CUBE_5); diff --git a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java similarity index 73% rename from src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java rename to src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java index 32c19b81d..decf997a6 100644 --- a/src/main/java/com/hbm/world/gen/util/DungeonSpawnerInteractions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -1,30 +1,22 @@ package com.hbm.world.gen.util; -import com.hbm.blocks.generic.DungeonSpawner.TileEntityDungeonSpawner; -import com.hbm.entity.missile.EntityMissileTier2; +import com.hbm.blocks.generic.LogicBlock; +import com.hbm.blocks.generic.LogicBlock.TileEntityLogicBlock; import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; -import com.hbm.tileentity.TileEntityDoorGeneric; -import com.hbm.util.Vec3NT; -import com.hbm.world.WorldUtil; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.function.Consumer; /**Interactions are called when the player right-clicks the block**/ -public class DungeonSpawnerInteractions { +public class LogicBlockInteractions { /**Consumer consists of world instance, tile entity instance, three ints for coordinates, one int for block side, and player instance, * in that order **/ @@ -32,23 +24,23 @@ public class DungeonSpawnerInteractions { public static Consumer TEST = (array) -> { World world = (World) array[0]; - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; int x = (int) array[2]; int y = (int) array[3]; int z = (int) array[4]; EntityPlayer player = (EntityPlayer) array[5]; int side = (int) array[6]; - if(spawner.phase > 1) return; + if(logic.phase > 1) return; if(player.getHeldItem() != null) player.getHeldItem().stackSize--; - spawner.phase++; + logic.phase++; }; public static Consumer RAD_CONTAINMENT_SYSTEM = (array) -> { - TileEntityDungeonSpawner spawner = (TileEntityDungeonSpawner) array[1]; + LogicBlock.TileEntityLogicBlock logic = (LogicBlock.TileEntityLogicBlock) array[1]; EntityPlayer player = (EntityPlayer) array[5]; if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.key){ @@ -58,8 +50,8 @@ public class DungeonSpawnerInteractions { EnumChatFormatting.RESET + " Radiation treatment administered")); player.addPotionEffect(new PotionEffect(HbmPotion.radaway.getId(), 3 * 60 * 20, 4)); player.addPotionEffect(new PotionEffect(HbmPotion.radx.getId(), 3 * 60 * 20, 4)); - spawner.phase = 2; - spawner.timer = 0; + logic.phase = 2; + logic.timer = 0; } }; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index dcb6d68b3..c5fd461eb 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5279,7 +5279,7 @@ tile.ducrete_smooth_stairs.name=Ducrete Stairs tile.dummy_block.name=Dummy Block tile.dummy_port.name=Dummy Block (Electricity Port) tile.dungeon_chain.name=Metal Chain -tile.dungeon_spawner.name=Dungeon Action Block +tile.logic_block.name=Dungeon Action Block tile.dynamite.name=Dynamite tile.emp_bomb.name=EMP Device tile.factory_advanced_conductor.name=Advanced Factory Electricity Port @@ -6062,7 +6062,7 @@ tile.volcano_rad_core.name=Rad Volcano Core tile.wand_air.name=Structure Wand Block (Air) tile.wand_loot.name=Structure Wand Block (Lootable) tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) -tile.wand_spawner.name=Structure Wand Block (Actions) +tile.wand_logic.name=Structure Wand Block (Logic) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/textures/blocks/logic_block.png b/src/main/resources/assets/hbm/textures/blocks/logic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0d69e2f3a978d2bf12ddc5b5cbfb1842ba7510 GIT binary patch literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#X;^dWMl%nE(*xb zY-a(BX93wDkO0IW{V*EMQU+$Aci0(NfGP}(j13qUKuiVcU|j$)X$p`H0!%=2n7}H7 zEG>X6s4hbT1CZ?M21ViEc@`Q#b+(=^jv*HQzCpSEw*o}=>F?dEtN)5U!RbuG4&KgV zE{oqaci#N3F7Vi4ruQ+EnJOGSncgqo?tMGYY15mUjB}@p=K-O2eqNr%b4LM-zRAlp zmx|QsO&5035$mq8>(82`k|<$x?Ad3_z5DjX>4{yuJ^QTXNoG&U`_ogS;hZ4FDZYqw~rU$lJ8xq{k3lIKhI1bj>8vh zk8jMCo@>20aBI}s+_h16Cl=M$%l|CenG-q9Q>ck;%?S=i9^RutFaQ0kGm!Z5yY_l% zYp$}TRDb*7hwJag`ets7ND;8&W%6j5yDci-jIEYqr@*Cc$@lGnpi8MeHR0Lseac53 zU%veIZSMBlXWNX}cFy%v*Jn|Smg$|z{54Y4G`!<*bMxfM!pS~+4DWpW^y$-=H#{5+ z+e8+8x8a{YO--1D8D1it-Rb>DsQqh|{(-fj4_hd;{s>7^O>l{;j1w;tN< z#rnm7!E32d+%tB?*D4zet`%5MnQ(sVtQFS_x9{F^q(96+N#5J1z z(8F|LpIJ)ta?j+OJ>MKDaD4sx^^;Gs%zj`!*N^dmPV(~b@bK=NXRcYXEWft1rcSmk zq4A~4#mrsLcYVk`9W+Nf*`mZ{hF>Pr#vmp^$-_CbA8lMB67;CuxJT2e>8cmUNAY#m VmCt%+=9_>Lm8Ywp%Q~loCIFqXPX_=1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic.png similarity index 100% rename from src/main/resources/assets/hbm/textures/blocks/wand_spawner.png rename to src/main/resources/assets/hbm/textures/blocks/wand_logic.png diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png similarity index 100% rename from src/main/resources/assets/hbm/textures/blocks/wand_spawner_top.png rename to src/main/resources/assets/hbm/textures/blocks/wand_logic_top.png From ef54c6e23b47447666d765bf147738d5c7b86ae4 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Wed, 9 Jul 2025 23:22:51 +0200 Subject: [PATCH 24/45] Added Forge MicroBlocks support --- .../microblocks/MicroBlocksCompatHandler.java | 77 +++++++++++++++++++ src/main/java/com/hbm/main/MainRegistry.java | 7 +- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java diff --git a/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java new file mode 100644 index 000000000..3abe4eb0d --- /dev/null +++ b/src/main/java/com/hbm/handler/microblocks/MicroBlocksCompatHandler.java @@ -0,0 +1,77 @@ +package com.hbm.handler.microblocks; + +import com.hbm.blocks.ModBlocks; +import cpw.mods.fml.common.event.FMLInterModComms; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +public class MicroBlocksCompatHandler { + public static void preInit() { + registerMicroBlockCompat(ModBlocks.basalt); + registerMicroBlockCompat(ModBlocks.basalt_smooth); + registerMicroBlockCompat(ModBlocks.basalt_brick); + registerMicroBlockCompat(ModBlocks.basalt_polished); + registerMicroBlockCompat(ModBlocks.basalt_tiles); + + registerMicroBlockCompat(ModBlocks.deco_titanium); + registerMicroBlockCompat(ModBlocks.deco_red_copper); + registerMicroBlockCompat(ModBlocks.deco_tungsten); + registerMicroBlockCompat(ModBlocks.deco_aluminium); + registerMicroBlockCompat(ModBlocks.deco_steel); + registerMicroBlockCompat(ModBlocks.deco_rusty_steel); + registerMicroBlockCompat(ModBlocks.deco_lead); + registerMicroBlockCompat(ModBlocks.deco_beryllium); + registerMicroBlockCompat(ModBlocks.deco_asbestos); + registerMicroBlockCompat(ModBlocks.deco_rbmk); + registerMicroBlockCompat(ModBlocks.deco_rbmk_smooth); + + registerMicroBlockCompat(ModBlocks.asphalt); + registerMicroBlockCompat(ModBlocks.asphalt_light); + + registerMicroBlockCompat(ModBlocks.reinforced_brick); + registerMicroBlockCompat(ModBlocks.reinforced_ducrete); + registerMicroBlockCompat(ModBlocks.reinforced_sand); + + registerMicroBlockCompat(ModBlocks.reinforced_stone); + registerMicroBlockCompat(ModBlocks.concrete_smooth); + registerMicroBlockCompat(ModBlocks.concrete_colored); + registerMicroBlockCompat(ModBlocks.concrete_colored_ext); + registerMicroBlockCompat(ModBlocks.concrete); + registerMicroBlockCompat(ModBlocks.concrete_asbestos); + registerMicroBlockCompat(ModBlocks.concrete_super); + registerMicroBlockCompat(ModBlocks.concrete_super_broken); + registerMicroBlockCompat(ModBlocks.ducrete_smooth); + registerMicroBlockCompat(ModBlocks.ducrete); + registerMicroBlockCompat(ModBlocks.concrete_pillar); + registerMicroBlockCompat(ModBlocks.brick_concrete); + registerMicroBlockCompat(ModBlocks.brick_concrete_mossy); + registerMicroBlockCompat(ModBlocks.brick_concrete_cracked); + registerMicroBlockCompat(ModBlocks.brick_concrete_broken); + registerMicroBlockCompat(ModBlocks.brick_concrete_marked); + registerMicroBlockCompat(ModBlocks.brick_ducrete); + registerMicroBlockCompat(ModBlocks.brick_obsidian); + registerMicroBlockCompat(ModBlocks.brick_light); + registerMicroBlockCompat(ModBlocks.brick_compound); + registerMicroBlockCompat(ModBlocks.brick_asbestos); + registerMicroBlockCompat(ModBlocks.brick_fire); + registerMicroBlockCompat(ModBlocks.lightstone); + + registerMicroBlockCompat(ModBlocks.cmb_brick); + registerMicroBlockCompat(ModBlocks.cmb_brick_reinforced); + registerMicroBlockCompat(ModBlocks.vinyl_tile); + + registerMicroBlockCompat(ModBlocks.tile_lab); + registerMicroBlockCompat(ModBlocks.tile_lab_cracked); + registerMicroBlockCompat(ModBlocks.tile_lab_broken); + } + + private static void registerMicroBlockCompat(Block block) { + for(int meta = 0; meta < 15; meta++) { + registerMicroBlockCompat(block, meta); + } + } + + private static void registerMicroBlockCompat(Block block, int meta) { + FMLInterModComms.sendMessage("ForgeMicroblock", "microMaterial", new ItemStack(block, 1, meta)); + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4c8e7f954..87c33fced 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -18,6 +18,7 @@ import com.hbm.handler.imc.IMCBlastFurnace; import com.hbm.handler.imc.IMCCentrifuge; import com.hbm.handler.imc.IMCCrystallizer; import com.hbm.handler.imc.IMCHandler; +import com.hbm.handler.microblocks.MicroBlocksCompatHandler; import com.hbm.handler.neutron.NeutronHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; @@ -661,6 +662,8 @@ public class MainRegistry { } } }); + + MicroBlocksCompatHandler.preInit(); } @EventHandler @@ -903,14 +906,14 @@ public class MainRegistry { Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); CommandReloadClient.register(); - + // to make sure that foreign registered fluids are accounted for, // even when the reload listener is registered too late due to load order Fluids.reloadFluids(); //ExplosionTests.runTest(); } - + @EventHandler public void preInit(FMLPreInitializationEvent event) { if(logger == null) From 89100738f46bddce02101106497f5e24866113e2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 10 Jul 2025 16:58:37 +0200 Subject: [PATCH 25/45] holy cungadero do i feel good --- changelog | 7 +- .../hbm/entity/mob/EntityHunterChopper.java | 16 +-- .../gui/GUIMachineAssemblyMachine.java | 8 +- .../inventory/recipes/AssemblerRecipes.java | 7 -- .../recipes/AssemblyMachineRecipes.java | 58 +++++++++- src/main/java/com/hbm/items/ModItems.java | 28 +---- .../com/hbm/items/special/ItemStarterKit.java | 108 ++++++++---------- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 6 +- src/main/java/com/hbm/main/MainRegistry.java | 7 ++ .../java/com/hbm/main/ModEventHandler.java | 2 - .../tileentity/RenderAssemblyMachine.java | 10 +- .../machine/TileEntityMachineCentrifuge.java | 5 +- .../machine/TileEntityMachineGasCent.java | 47 ++++---- .../hbm/world/gen/util/LogicBlockActions.java | 1 - .../world/gen/util/LogicBlockConditions.java | 1 - .../gen/util/LogicBlockInteractions.java | 1 - 16 files changed, 167 insertions(+), 145 deletions(-) diff --git a/changelog b/changelog index d6b838a91..d0426ccf0 100644 --- a/changelog +++ b/changelog @@ -3,5 +3,10 @@ ## Changed * Removed levitation unit +* Many of NTM's regular building blocks now have forge microblock support +* RBMK crane models now conform to the dimensions of the room they're in -## Fixed \ No newline at end of file +## Fixed +* Fixed gas centrifuge sound persisting when broken or when unloaded +* Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots +* Fixed guns that don't have durability always displaying a condition of 0% \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java index 91b544fdc..647348883 100644 --- a/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java +++ b/src/main/java/com/hbm/entity/mob/EntityHunterChopper.java @@ -3,6 +3,7 @@ package com.hbm.entity.mob; import com.hbm.entity.projectile.EntityBullet; import com.hbm.entity.projectile.EntityChopperMine; import com.hbm.handler.threading.PacketThreading; +import com.hbm.interfaces.Spaghetti; import com.hbm.items.ModItems; import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; @@ -26,6 +27,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +@Spaghetti("this sucks complete donkey shit") public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisplayData, IRadiationImmune { public int courseChangeCooldown; @@ -335,20 +337,6 @@ public class EntityHunterChopper extends EntityFlying implements IMob, IBossDisp * kill this mob. */ protected void dropItems() { - - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_head, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_torso, 1); - if(rand.nextInt(2) == 0) - this.dropItem(ModItems.chopper_wing, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_tail, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_gun, 1); - if(rand.nextInt(3) == 0) - this.dropItem(ModItems.chopper_blades, 1); - this.dropItem(ModItems.combine_scrap, rand.nextInt(8) + 1); this.dropItem(ModItems.plate_combine_steel, rand.nextInt(5) + 1); } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index 8218c4057..1572ed3be 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -33,8 +33,8 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 115, 34, 16); - assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 115, 34, 16); + assembler.inputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 99, 52, 16); + assembler.outputTank.renderTankInfo(this, mouseX, mouseY, guiLeft + 80, guiTop + 99, 52, 16); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 152, guiTop + 18, 16, 61, assembler.power, assembler.maxPower); @@ -115,7 +115,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { GL11.glDisable(GL11.GL_BLEND); } - assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 34, 16, 1); - assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 34, 16, 1); + assembler.inputTank.renderTank(guiLeft + 8, guiTop + 115, this.zLevel, 52, 16, 1); + assembler.outputTank.renderTank(guiLeft + 80, guiTop + 115, this.zLevel, 52, 16, 1); } } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 233f67933..f725cd17a 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -100,12 +100,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.warhead_volcano, 1), new AStack[] {new OreDictStack(TI.plate(), 24), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()) }, 600); makeRecipe(new ComparableStack(ModItems.missile_stealth, 1), new AStack[] { new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(CU.plate(), 10), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32) },1200); makeRecipe(new ComparableStack(ModItems.thruster_nuclear, 1), new AStack[] {new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel) },600); - makeRecipe(new ComparableStack(ModItems.chopper_head, 1), new AStack[] {new ComparableStack(ModBlocks.reinforced_glass, 2), new OreDictStack(CMB.ingot(), 22), new OreDictStack(MAGTUNG.wireFine(), 4), },300); - makeRecipe(new ComparableStack(ModItems.chopper_gun, 1), new AStack[] {new OreDictStack(CMB.plate(), 4), new OreDictStack(CMB.ingot(), 2), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 1), new ComparableStack(ModItems.motor, 1), },150); - makeRecipe(new ComparableStack(ModItems.chopper_torso, 1), new AStack[] {new OreDictStack(CMB.ingot(), 26), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.chopper_blades, 2), },350); - makeRecipe(new ComparableStack(ModItems.chopper_tail, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(CMB.ingot(), 5), new OreDictStack(MAGTUNG.wireFine(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.chopper_blades, 2), },200); - makeRecipe(new ComparableStack(ModItems.chopper_wing, 1), new AStack[] {new OreDictStack(CMB.plate(), 6), new OreDictStack(CMB.ingot(), 3), new OreDictStack(MAGTUNG.wireFine(), 2), },150); - makeRecipe(new ComparableStack(ModItems.chopper_blades, 1), new AStack[] {new OreDictStack(CMB.plate(), 8), new OreDictStack(STEEL.plate(), 2), new OreDictStack(CMB.ingot(), 2), },200); makeRecipe(new ComparableStack(ModItems.tritium_deuterium_cake, 1), new AStack[] {new ComparableStack(ModItems.cell_deuterium, 6), new ComparableStack(ModItems.cell_tritium, 2), new OreDictStack(LI.ingot(), 4), },150); makeRecipe(new ComparableStack(ModItems.pellet_cluster, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new ComparableStack(Blocks.tnt, 1), }, 50); makeRecipe(new ComparableStack(ModItems.pellet_buckshot, 1), new AStack[] {new OreDictStack(PB.nugget(), 6), }, 50); @@ -170,7 +164,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8), },250); makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); makeRecipe(new ComparableStack(ModBlocks.therm_exo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4), },250); - makeRecipe(new ComparableStack(ModItems.spawn_chopper, 1), new AStack[] {new ComparableStack(ModItems.chopper_blades, 5), new ComparableStack(ModItems.chopper_gun, 1), new ComparableStack(ModItems.chopper_head, 1), new ComparableStack(ModItems.chopper_tail, 1), new ComparableStack(ModItems.chopper_torso, 1), new ComparableStack(ModItems.chopper_wing, 2), },300); makeRecipe(new ComparableStack(ModItems.grenade_fire, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_shrapnel, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2), },150); makeRecipe(new ComparableStack(ModItems.grenade_cluster, 1), new AStack[] {new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2), },200); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 1e741f6b7..5031cc364 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -13,6 +13,7 @@ import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; @@ -62,9 +63,61 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(GOLD.wireFine(), 2), new OreDictStack(SI.billet(), 1))); this.register(new GenericRecipe("ass.rtgunit").setup(100, 100).outputItems(new ItemStack(ModItems.rtg_unit, 1)) .inputItems(new OreDictStack(PB.plateCast(), 2), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.thermo_element, 2))); + this.register(new GenericRecipe("ass.magnetron").setup(40, 100).outputItems(new ItemStack(ModItems.magnetron, 1)) + .inputItems(new OreDictStack(CU.plate(), 3), new OreDictStack(W.wireFine(), 4))); this.register(new GenericRecipe("ass.titaniumdrill").setup(100, 100).outputItems(new ItemStack(ModItems.drill_titanium, 1)) .inputItems(new OreDictStack(DURA.plateCast(), 1), new OreDictStack(TI.plate(), 8))); + this.register(new GenericRecipe("ass.entanglementkit").setup(200, 100).outputItems(new ItemStack(ModItems.entanglement_kit, 1)) + .inputItems(new OreDictStack(DURA.plateCast(), 4), new OreDictStack(CU.plate(), 24), new OreDictStack(GOLD.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 8_000))); + this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + // weapon parts + this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); + this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) + .inputItems(new OreDictStack(PB.nugget(), 6))); + + // missile parts + this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) + .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_generic_small, 1)) + .inputItems(new OreDictStack(TI.plate(), 4), new ComparableStack(ModItems.ball_dynamite, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CHIP))); + this.register(new GenericRecipe("ass.warheadhe2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_generic_medium, 1)) + .inputItems(new OreDictStack(TI.plate(), 8), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.warheadhe3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_generic_large, 1)) + .inputItems(new OreDictStack(TI.plate(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.warheadinc1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(P_RED.dust(), 2))); + this.register(new GenericRecipe("ass.warheadinc2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(P_RED.dust(), 4))); + this.register(new GenericRecipe("ass.warheadinc3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_incendiary_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(P_RED.dust(), 8))); + this.register(new GenericRecipe("ass.warheadcl1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_cluster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new ComparableStack(ModItems.pellet_cluster, 2))); + this.register(new GenericRecipe("ass.warheadcl2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_cluster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new ComparableStack(ModItems.pellet_cluster, 4))); + this.register(new GenericRecipe("ass.warheadcl3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_cluster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new ComparableStack(ModItems.pellet_cluster, 8))); + this.register(new GenericRecipe("ass.warheadbb1").setup(100, 100).outputItems(new ItemStack(ModItems.warhead_buster_small, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_small, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 2))); + this.register(new GenericRecipe("ass.warheadbb2").setup(200, 100).outputItems(new ItemStack(ModItems.warhead_buster_medium, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_medium, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4))); + this.register(new GenericRecipe("ass.warheadbb3").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_buster_large, 1)) + .inputItems(new ComparableStack(ModItems.warhead_generic_large, 1), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8))); + this.register(new GenericRecipe("ass.warheadnuke").setup(400, 100).outputItems(new ItemStack(ModItems.warhead_nuclear, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(U235.billet(), 6), new ComparableStack(ModItems.cordite, 12), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER))); + this.register(new GenericRecipe("ass.warheadthermonuke").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_mirv, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(PB.plateCast(), 6), new OreDictStack(PU239.billet(), 8), new ComparableStack(ModItems.ball_tatb, 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER_ADVANCED)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 4_000))); + this.register(new GenericRecipe("ass.warheadvolcano").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_volcano, 1)) + .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(STEEL.plateCast(), 6), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()))); + this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) + .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); + this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); + // bunker blocks this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); @@ -72,7 +125,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); - this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); // machines @@ -81,6 +134,9 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + // rancid shit mob spawners + this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) + .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b66b8f403..d3a6cef3c 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -642,13 +642,7 @@ public class ModItems { public static Item seg_10; public static Item seg_15; public static Item seg_20; - - public static Item chopper_head; - public static Item chopper_gun; - public static Item chopper_torso; - public static Item chopper_tail; - public static Item chopper_wing; - public static Item chopper_blades; + public static Item combine_scrap; public static Item shimmer_head; @@ -746,15 +740,12 @@ public class ModItems { public static Item pellet_rtg_gold; public static Item pellet_rtg_lead; - public static Item tritium_deuterium_cake; + @Deprecated public static Item tritium_deuterium_cake; public static Item piston_selenium; public static Item piston_set; public static Item drillbit; - //public static Item crystal_energy; - //public static Item pellet_coolant; - public static Item rune_blank; public static Item rune_isa; public static Item rune_dagaz; @@ -2191,7 +2182,6 @@ public class ModItems { public static Item polaroid; public static Item glitch; - public static Item letter; public static Item book_secret; public static Item book_of_; public static Item page_of_; @@ -2791,12 +2781,6 @@ public class ModItems { seg_15 = new Item().setUnlocalizedName("seg_15").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_15"); seg_20 = new Item().setUnlocalizedName("seg_20").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":seg_20"); - chopper_head = new Item().setUnlocalizedName("chopper_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_head"); - chopper_gun = new Item().setUnlocalizedName("chopper_gun").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_gun"); - chopper_torso = new Item().setUnlocalizedName("chopper_torso").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_torso"); - chopper_tail = new Item().setUnlocalizedName("chopper_tail").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_tail"); - chopper_wing = new Item().setUnlocalizedName("chopper_wing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_wing"); - chopper_blades = new Item().setUnlocalizedName("chopper_blades").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chopper_blades"); combine_scrap = new Item().setUnlocalizedName("combine_scrap").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":combine_scrap"); shimmer_head = new Item().setUnlocalizedName("shimmer_head").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":shimmer_head_original"); @@ -4933,7 +4917,6 @@ public class ModItems { polaroid = new ItemPolaroid().setUnlocalizedName("polaroid").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":polaroid_" + MainRegistry.polaroidID); glitch = new ItemGlitch().setUnlocalizedName("glitch").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":glitch_" + MainRegistry.polaroidID); - letter = new ItemStarterKit().setUnlocalizedName("letter").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":letter"); book_secret = new ItemCustomLore().setUnlocalizedName("book_secret").setCreativeTab(MainRegistry.polaroidID == 11 ? MainRegistry.consumableTab : null).setTextureName(RefStrings.MODID + ":book_secret"); book_of_ = new ItemBook().setUnlocalizedName("book_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":book_of_"); page_of_ = new ItemEnumMulti(ItemEnums.EnumPages.class, true, false).setUnlocalizedName("page_of_").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":page_of_"); @@ -5593,12 +5576,6 @@ public class ModItems { GameRegistry.registerItem(seg_20, seg_20.getUnlocalizedName()); //Chopper parts - GameRegistry.registerItem(chopper_head, chopper_head.getUnlocalizedName()); - GameRegistry.registerItem(chopper_gun, chopper_gun.getUnlocalizedName()); - GameRegistry.registerItem(chopper_torso, chopper_torso.getUnlocalizedName()); - GameRegistry.registerItem(chopper_tail, chopper_tail.getUnlocalizedName()); - GameRegistry.registerItem(chopper_wing, chopper_wing.getUnlocalizedName()); - GameRegistry.registerItem(chopper_blades, chopper_blades.getUnlocalizedName()); GameRegistry.registerItem(combine_scrap, combine_scrap.getUnlocalizedName()); //Hammer Parts @@ -7116,7 +7093,6 @@ public class ModItems { GameRegistry.registerItem(euphemium_kit, euphemium_kit.getUnlocalizedName()); GameRegistry.registerItem(legacy_toolbox, legacy_toolbox.getUnlocalizedName()); GameRegistry.registerItem(toolbox, toolbox.getUnlocalizedName()); - GameRegistry.registerItem(letter, letter.getUnlocalizedName()); //Misile Loot Boxes GameRegistry.registerItem(loot_10, loot_10.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemStarterKit.java b/src/main/java/com/hbm/items/special/ItemStarterKit.java index 4e70ed205..ba8bf97b4 100644 --- a/src/main/java/com/hbm/items/special/ItemStarterKit.java +++ b/src/main/java/com/hbm/items/special/ItemStarterKit.java @@ -10,7 +10,6 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; import com.hbm.items.machine.ItemBreedingRod.BreedingRodType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; -import com.hbm.util.ShadyUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,10 +21,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; -@Deprecated //not deprecated per se but please stop using it wherever possible +@Deprecated @Spaghetti("i do not care how much 'optimization' you want to throw at this dumpster fire but there's no saving grace here") public class ItemStarterKit extends Item { @@ -75,8 +73,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_difurnace_off, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_gascent, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_reactor_breeding, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 1)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.reactor_research, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway, 8)); @@ -95,7 +93,6 @@ public class ItemStarterKit extends Item { if(this == ModItems.nuke_advanced_kit) { - player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_yellowcake, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.powder_plutonium, 64)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.ingot_steel, 64)); @@ -113,8 +110,8 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_turbine, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_radgen, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_rtg_grey, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembler, 3)); - player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemplant, 2)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_assembly_machine, 3)); + player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_chemical_plant, 2)); player.inventory.addItemStackToInventory(new ItemStack(ModBlocks.machine_fluidtank, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pellet_rtg, 1)); @@ -128,7 +125,6 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(ModItems.radaway_strong, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.radx, 4)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.pill_iodine, 1)); - player.inventory.addItemStackToInventory(new ItemStack(ModItems.tritium_deuterium_cake, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.geiger_counter, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.survey_scanner, 1)); player.inventory.addItemStackToInventory(new ItemStack(ModItems.gas_mask_m65, 1)); @@ -440,29 +436,17 @@ public class ItemStarterKit extends Item { player.inventory.addItemStackToInventory(new ItemStack(Item.getItemFromBlock(ModBlocks.statue_elb_f), 1)); } - if(this == ModItems.hazmat_kit) - { + if(this == ModItems.hazmat_kit) { giveHaz(world, player, 0); } - - if(this == ModItems.hazmat_red_kit) - { + + if(this == ModItems.hazmat_red_kit) { giveHaz(world, player, 1); } - - if(this == ModItems.hazmat_grey_kit) - { + + if(this == ModItems.hazmat_grey_kit) { giveHaz(world, player, 2); } - - if(this == ModItems.letter && world.isRemote) - { - if(player.getUniqueID().toString().equals(ShadyUtil.a20)) { - player.addChatMessage(new ChatComponentText("Error: null reference @ com.hbm.items.ItemStarterKit.class, please report this to the modder!")); - } else { - player.addChatMessage(new ChatComponentText("You rip the letter in half; nothing happens.")); - } - } world.playSoundAtEntity(player, "hbm:item.unpack", 1.0F, 1.0F); stack.stackSize--; @@ -470,42 +454,42 @@ public class ItemStarterKit extends Item { } - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.nuke_electric_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.t45_kit || - this == ModItems.grenade_kit || - this == ModItems.missile_kit || - this == ModItems.multi_kit) { - list.add("Please empty inventory before opening!"); - } - if(this == ModItems.nuke_starter_kit || - this == ModItems.nuke_advanced_kit || - this == ModItems.nuke_commercially_kit || - this == ModItems.gadget_kit || - this == ModItems.boy_kit || - this == ModItems.man_kit || - this == ModItems.mike_kit || - this == ModItems.tsar_kit || - this == ModItems.prototype_kit || - this == ModItems.fleija_kit || - this == ModItems.solinium_kit || - this == ModItems.hazmat_kit) { - list.add("Armor will be displaced by hazmat suit."); - } - } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.nuke_electric_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.t45_kit || + this == ModItems.grenade_kit || + this == ModItems.missile_kit || + this == ModItems.multi_kit) { + list.add("Please empty inventory before opening!"); + } + if(this == ModItems.nuke_starter_kit || + this == ModItems.nuke_advanced_kit || + this == ModItems.nuke_commercially_kit || + this == ModItems.gadget_kit || + this == ModItems.boy_kit || + this == ModItems.man_kit || + this == ModItems.mike_kit || + this == ModItems.tsar_kit || + this == ModItems.prototype_kit || + this == ModItems.fleija_kit || + this == ModItems.solinium_kit || + this == ModItems.hazmat_kit) { + list.add("Armor will be displaced by hazmat suit."); + } + } } 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 3539a712b..66cb14695 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -184,8 +184,10 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD, I } float maxDura = config.getDurability(stack); - int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); - list.add("Condition: " + dura + "%"); + if(maxDura > 0) { + int dura = MathHelper.clamp_int((int)((maxDura - this.getWear(stack, i)) * 100 / maxDura), 0, 100); + list.add("Condition: " + dura + "%"); + } for(ItemStack upgrade : WeaponModManager.getUpgradeItems(stack, i)) { list.add(EnumChatFormatting.YELLOW + upgrade.getDisplayName()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 4bd2975ed..5b9d63062 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1707,6 +1707,13 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.machine_transformer_20"); ignoreMappings.add("hbm:tile.machine_transformer_dnt_20"); ignoreMappings.add("hbm:item.levitation_unit"); + ignoreMappings.add("hbm:item.letter"); + ignoreMappings.add("hbm:item.chopper_head"); + ignoreMappings.add("hbm:item.chopper_gun"); + ignoreMappings.add("hbm:item.chopper_torso"); + ignoreMappings.add("hbm:item.chopper_tail"); + ignoreMappings.add("hbm:item.chopper_wing"); + ignoreMappings.add("hbm:item.chopper_blades"); /// 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 655656174..1f0be79bf 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -10,7 +10,6 @@ import com.hbm.config.MobConfig; import com.hbm.config.RadiationConfig; import com.hbm.config.ServerConfig; import com.hbm.entity.mob.*; -import com.hbm.entity.mob.ai.EntityAIFireGun; import com.hbm.entity.projectile.EntityBulletBaseMK4; import com.hbm.entity.projectile.EntityBurningFOEQ; import com.hbm.entity.train.EntityRailCarBase; @@ -76,7 +75,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAITasks; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.*; diff --git a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java index 6bb9a7f21..1111a998a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java +++ b/src/main/java/com/hbm/render/tileentity/RenderAssemblyMachine.java @@ -111,8 +111,16 @@ public class RenderAssemblyMachine extends TileEntitySpecialRenderer implements EntityPlayer player = Minecraft.getMinecraft().thePlayer; ItemStack stack = recipe.getIcon(); + stack.stackSize = 1; - if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { + if(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock) { + if(RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType())) { + GL11.glTranslated(0, -0.0625, 0); + } else { + GL11.glTranslated(0, -0.125, 0); + GL11.glScaled(0.5, 0.5, 0.5); + } + } else { GL11.glRotated(-90, 1, 0, 0); GL11.glTranslated(0, -0.25, 0); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 07c5ea852..c5b5e9da6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -236,7 +236,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -247,6 +247,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -276,7 +277,7 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index 62e76ae0e..7a63ee4d7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -151,7 +151,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(te instanceof TileEntityMachineGasCent) { TileEntityMachineGasCent cent = (TileEntityMachineGasCent) te; - if(cent.tank.getFill() == 0 && cent.tank.getTankType() == tank.getTankType()) { + if(cent.tank.getTankType() == tank.getTankType()) { if(cent.inputTank.getTankType() != outputTank.getTankType() && outputTank.getTankType() != PseudoFluidType.NONE) { cent.inputTank.setTankType(outputTank.getTankType()); cent.outputTank.setTankType(outputTank.getTankType().getOutputType()); @@ -237,7 +237,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audioDuration = MathHelper.clamp_int(audioDuration, 0, 60); - if(audioDuration > 10) { + if(audioDuration > 10 && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 25) { if(audio == null) { audio = createAudioLoop(); @@ -248,6 +248,7 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I audio.updateVolume(getVolume(1F)); audio.updatePitch((audioDuration - 10) / 100F + 0.5F); + audio.keepAlive(); } else { @@ -261,7 +262,27 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F); + return MainRegistry.proxy.getLoopedSound("hbm:block.centrifugeOperate", xCoord, yCoord, zCoord, 1.0F, 10F, 1.0F, 20); + } + + @Override + public void onChunkUnload() { + + if(audio != null) { + audio.stopSound(); + audio = null; + } + } + + @Override + public void invalidate() { + + super.invalidate(); + + if(audio != null) { + audio.stopSound(); + audio = null; + } } @Override @@ -314,21 +335,9 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I }; } - @Override - public void setPower(long i) { - power = i; - } - - @Override - public long getPower() { - return power; - - } - - @Override - public long getMaxPower() { - return maxPower; - } + @Override public void setPower(long i) { power = i; } + @Override public long getPower() { return power; } + @Override public long getMaxPower() { return maxPower; } public int getProcessingSpeed() { if(slots[6] != null && slots[6].getItem() == ModItems.upgrade_gc_speed) { @@ -352,7 +361,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I tank.setTankType(newType); } } - } } @@ -374,7 +382,6 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I if(bb == null) { bb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } - return bb; } diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java index 2b3682c7c..af2c41356 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockActions.java @@ -3,7 +3,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockSkeletonHolder; -import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.item.EntityFallingBlockNT; import com.hbm.entity.missile.EntityMissileTier2; diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java index 5065a38fd..b51b96c23 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockConditions.java @@ -2,7 +2,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockPedestal; -import com.hbm.blocks.generic.DungeonSpawner; import com.hbm.blocks.generic.LogicBlock; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ModItems; diff --git a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java index decf997a6..bf3bc47eb 100644 --- a/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java +++ b/src/main/java/com/hbm/world/gen/util/LogicBlockInteractions.java @@ -1,7 +1,6 @@ package com.hbm.world.gen.util; import com.hbm.blocks.generic.LogicBlock; -import com.hbm.blocks.generic.LogicBlock.TileEntityLogicBlock; import com.hbm.items.ModItems; import com.hbm.potion.HbmPotion; import net.minecraft.entity.player.EntityPlayer; From 16fcac0a3c7dac86a86ebe98adfc9e8086cad566 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 14:53:50 +0300 Subject: [PATCH 26/45] Support collision-only/visual-only boxes on doors --- .../hbm/blocks/generic/BlockDoorGeneric.java | 12 +++--- .../java/com/hbm/tileentity/DoorDecl.java | 42 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 365187ff4..3dfe4814a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -94,7 +94,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) { - AxisAlignedBB box = getBoundingBox(worldIn, x, y ,z); + AxisAlignedBB box = getBoundingBox(worldIn, x, y, z, true); box = AxisAlignedBB.getBoundingBox( Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ)); @@ -113,7 +113,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z); + AxisAlignedBB aabb = this.getBoundingBox(world, x, y, z, true); if(aabb.minX == aabb.maxX && aabb.minY == aabb.maxY && aabb.minZ == aabb.maxZ) return null; return aabb; } @@ -121,7 +121,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { // Enables clicking through the open door @Override public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 startVec, Vec3 endVec) { - AxisAlignedBB box = getBoundingBox(world, x, y ,z); + AxisAlignedBB box = getBoundingBox(world, x, y, z, false); box = AxisAlignedBB.getBoundingBox( Math.min(box.minX, box.maxX), Math.min(box.minY, box.maxY), Math.min(box.minZ, box.maxZ), Math.max(box.minX, box.maxX), Math.max(box.minY, box.maxY), Math.max(box.minZ, box.maxZ) @@ -158,11 +158,11 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { - return getBoundingBox(world, x, y, z); + return getBoundingBox(world, x, y, z, false); //return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); } - public AxisAlignedBB getBoundingBox(World world, int x, int y, int z) { + public AxisAlignedBB getBoundingBox(World world, int x, int y, int z, boolean forCollision) { int meta = world.getBlockMetadata(x, y, z); TileEntity te = world.getTileEntity(x, y, z); int[] core = this.findCore(world, x, y, z); @@ -173,7 +173,7 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { TileEntity te2 = world.getTileEntity(core[0], core[1], core[2]); ForgeDirection dir = ForgeDirection.getOrientation(te2.getBlockMetadata() - BlockDummyable.offset); BlockPos pos = new BlockPos(x - core[0], y - core[1], z - core[2]).rotate(Rotation.getBlockRotation(dir).add(Rotation.COUNTERCLOCKWISE_90)); - AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open); + AxisAlignedBB box = type.getBlockBound(pos.getX(), pos.getY(), pos.getZ(), open, forCollision); switch(te2.getBlockMetadata() - offset){ case 2: return AxisAlignedBB.getBoundingBox(x + 1 - box.minX, y + box.minY, z + 1 - box.minZ, x + 1 - box.maxX, y + box.maxY, z + 1 - box.maxZ); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index ee1c96bc0..9c9887c13 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -67,8 +67,8 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { - return super.getBlockBound(x, y, z, open); + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -156,7 +156,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); if(z == 1) { @@ -168,7 +168,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); } else { - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -240,7 +240,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); @@ -248,7 +248,7 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); } } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } @Override @@ -327,7 +327,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0, 1); return AxisAlignedBB.getBoundingBox(0, 0.9375, 1 - 0.25, 1, 1, 1); @@ -429,7 +429,7 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { if(y > 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0.375, 1, 1, 0.625); @@ -441,7 +441,7 @@ public abstract class DoorDecl { } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); } else { - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); } } @@ -504,9 +504,9 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 1) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -2) { @@ -516,7 +516,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -595,7 +595,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(open) { if(z == 0) { return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); @@ -691,14 +691,14 @@ public abstract class DoorDecl { } @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 1, 1); if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); else if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -814,7 +814,7 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) { return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 1, 1); } else if(y > 1) { @@ -822,7 +822,7 @@ public abstract class DoorDecl { } else if(y == 0) { return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1018,15 +1018,15 @@ public abstract class DoorDecl { }; @Override - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { if(!open) - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); if(z == 3) { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -3) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); } - return super.getBlockBound(x, y, z, open); + return super.getBlockBound(x, y, z, open, forCollision); }; @Override @@ -1159,7 +1159,7 @@ public abstract class DoorDecl { public void doOffsetTransform() { } - public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open) { + public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } From 3c2d49419fe1392a3e1cd0522bb660ff2c02ec7d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 15:07:42 +0300 Subject: [PATCH 27/45] Use separate collision and visual boxes on doors Also improve the user experience with smaller doors, by making the visual hitbox cover the entire door even when open. (In repsonse to Mellow's critique) --- .../java/com/hbm/tileentity/DoorDecl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 9c9887c13..d04b030d3 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -166,7 +166,7 @@ public abstract class DoorDecl { } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.75, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.1, 1); } else { return super.getBlockBound(x, y, z, open, forCollision); } @@ -245,7 +245,7 @@ public abstract class DoorDecl { if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.08, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.08, 1); } } return super.getBlockBound(x, y, z, open, forCollision); @@ -328,9 +328,8 @@ public abstract class DoorDecl { @Override public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { - if(open) { - if(y == 0) return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 0, 1); - return AxisAlignedBB.getBoundingBox(0, 0.9375, 1 - 0.25, 1, 1, 1); + if(forCollision && open) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0); } else { return AxisAlignedBB.getBoundingBox(0, 0, 1 - 0.25, 1, 1, 1); } @@ -437,7 +436,7 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } if(y == 1) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); } else { @@ -514,7 +513,7 @@ public abstract class DoorDecl { } else if(y == 3) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 0.0625, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; @@ -596,7 +595,7 @@ public abstract class DoorDecl { @Override public AxisAlignedBB getBlockBound(int x, int y, int z, boolean open, boolean forCollision) { - if(open) { + if(forCollision && open) { if(z == 0) { return AxisAlignedBB.getBoundingBox(1 - 0.125, 0, 1 - 0.1875, 1, 1, 1); } else { @@ -697,7 +696,7 @@ public abstract class DoorDecl { if(y > 1) return AxisAlignedBB.getBoundingBox(0, 0.5, 0.5, 1, 1, 1); else if(y == 0) - return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, 0.1, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0.5, 1, forCollision ? 0 : 0.1, 1); return super.getBlockBound(x, y, z, open, forCollision); }; @@ -820,7 +819,7 @@ public abstract class DoorDecl { } else if(y > 1) { return AxisAlignedBB.getBoundingBox(0, 0.85, 0.75, 1, 1, 1); } else if(y == 0) { - return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, 0.15, 1); + return AxisAlignedBB.getBoundingBox(0, 0, 0.75, 1, forCollision ? 0 : 0.15, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; @@ -1025,6 +1024,8 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0.4, 0, 0, 1, 1, 1); } else if(z == -3) { return AxisAlignedBB.getBoundingBox(0, 0, 0, 0.6, 1, 1); + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } return super.getBlockBound(x, y, z, open, forCollision); }; From f2f3e04bb0419b0423d141acac58e9a853bdf97a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Fri, 11 Jul 2025 15:19:13 +0300 Subject: [PATCH 28/45] Fix gap in secure access door --- src/main/java/com/hbm/tileentity/DoorDecl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index d04b030d3..e7cf6981f 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -439,7 +439,9 @@ public abstract class DoorDecl { return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, forCollision ? 0 : 0.0625, 1); } else if(y == 4) { return AxisAlignedBB.getBoundingBox(0, 0.5, 0.15, 1, 1, 0.85); - } else { + } else if(y == 0) { + return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); + }else { return super.getBlockBound(x, y, z, open, forCollision); } } From 10d8551ce36dbb6d786a1482e28b39c3f7ab011d Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 11 Jul 2025 14:56:46 +0200 Subject: [PATCH 29/45] all zinced up --- changelog | 7 ++ .../com/hbm/inventory/UpgradeManagerNT.java | 2 +- .../recipes/AssemblyMachineRecipes.java | 78 ++++++++++++++----- src/main/java/com/hbm/items/ModItems.java | 2 +- .../TileEntityMachineCrystallizer.java | 34 ++++---- .../com/hbm/util/DamageResistanceHandler.java | 46 ++++++----- src/main/resources/assets/hbm/lang/de_DE.lang | 2 +- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- 8 files changed, 114 insertions(+), 59 deletions(-) diff --git a/changelog b/changelog index d0426ccf0..914e54d80 100644 --- a/changelog +++ b/changelog @@ -1,10 +1,17 @@ ## Added * New assembler + * Features a brand new animated model, GUI and the new recipe selection system + * Many recipes have been reworked, with the microcrafting complexity reduced + * The redcoil didn't get a recipe. It's gonna die soon. ## Changed * Removed levitation unit * Many of NTM's regular building blocks now have forge microblock support * RBMK crane models now conform to the dimensions of the room they're in +* Projectile resistance for armor has been renamed to "physical" and now also extends to all direct forms of attack by other entities that don't fall into any other categories (mostly melee attacks) + * This should fix the issue where most armors are quite weak against swords +* Electric attacks (i.e. tesla cannon) are now in the "energy damage" category + * This means that armors that have energy resistance actually properly work against the tesla cannon ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded diff --git a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java index 3ae55ae72..fae7ac9ef 100644 --- a/src/main/java/com/hbm/inventory/UpgradeManagerNT.java +++ b/src/main/java/com/hbm/inventory/UpgradeManagerNT.java @@ -31,7 +31,7 @@ public class UpgradeManagerNT { public UpgradeManagerNT(TileEntity te) { this.owner = te; } @Deprecated public UpgradeManagerNT() { } - public void checkSlots(ItemStack[] slots, int start, int end) { checkSlots(owner, slots, start, end); } + public void checkSlots(ItemStack[] slots, int start, int end) { checkSlotsInternal(owner, slots, start, end); } @Deprecated public void checkSlots(TileEntity te, ItemStack[] slots, int start, int end) { checkSlotsInternal(te, slots, start, end); } private void checkSlotsInternal(TileEntity te, ItemStack[] slots, int start, int end) { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 5031cc364..fa7202ec5 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -73,6 +73,64 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.protoreactor").setup(200, 100).outputItems(new ItemStack(ModItems.dysfunctional_reactor, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(PB.plateCast(), 4), new ComparableStack(ModItems.rod_quad_empty, 10), new OreDictStack(KEY_BROWN, 3))); + // powders + this.register(new GenericRecipe("ass.partlith").setup(40, 100).outputItems(new ItemStack(ModItems.part_lithium, 8)) + .inputItems(new OreDictStack(LI.dust(), 1))); + this.register(new GenericRecipe("ass.partberyl").setup(40, 100).outputItems(new ItemStack(ModItems.part_beryllium, 8)) + .inputItems(new OreDictStack(BE.dust(), 1))); + this.register(new GenericRecipe("ass.partcoal").setup(40, 100).outputItems(new ItemStack(ModItems.part_carbon, 8)) + .inputItems(new OreDictStack(COAL.dust(), 1))); + this.register(new GenericRecipe("ass.partcop").setup(40, 100).outputItems(new ItemStack(ModItems.part_copper, 8)) + .inputItems(new OreDictStack(CU.dust(), 1))); + this.register(new GenericRecipe("ass.partplut").setup(40, 100).outputItems(new ItemStack(ModItems.part_plutonium, 8)) + .inputItems(new OreDictStack(PU.dust(), 1))); + + // bunker blocks + this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); + this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) + .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); + this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); + this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // machines + this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) + .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) + .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3))); + this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + + // batteries + this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); + this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CO.dust(), 12), new OreDictStack(LI.dust(), 12))); + this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); + this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); + + // rancid shit mob spawners + this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) + .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); + // weapon parts this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) .inputItems(new OreDictStack(STEEL.plate(), 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 1))); @@ -117,26 +175,6 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); - - // bunker blocks - this.register(new GenericRecipe("ass.cmbtile").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick, 8)) - .inputItems(new OreDictStack(ANY_CONCRETE.any(), 4), new OreDictStack(CMB.plate(), 4))); - this.register(new GenericRecipe("ass.cmbbrick").setup(100, 100).outputItems(new ItemStack(ModBlocks.cmb_brick_reinforced, 8)) - .inputItems(new OreDictStack(MAGTUNG.ingot(), 8), new ComparableStack(ModBlocks.ducrete, 4), new ComparableStack(ModBlocks.cmb_brick, 8))); - this.register(new GenericRecipe("ass.sealframe").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_frame, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); - this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); - - // machines - this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); - this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) - .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); - - // rancid shit mob spawners - this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) - .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d3a6cef3c..251e2d396 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -322,7 +322,7 @@ public class ModItems { public static Item plate_combine_steel; public static Item plate_mixed; public static Item plate_paa; - public static Item pipes_steel; + @Deprecated public static Item pipes_steel; public static Item drill_titanium; public static Item plate_dalekanium; public static Item plate_euphemium; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index a72d1996e..1c1a940e9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -31,7 +31,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -51,7 +50,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme public FluidTank tank; - public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(); + public UpgradeManagerNT upgradeManager = new UpgradeManagerNT(this); public TileEntityMachineCrystallizer() { super(8); @@ -76,7 +75,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme tank.setType(7, slots); tank.loadTank(3, 4, slots); - upgradeManager.checkSlots(this, slots, 5, 6); + upgradeManager.checkSlots(slots, 5, 6); for(int i = 0; i < getCycleCount(); i++) { @@ -299,14 +298,8 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { - - CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack, tank.getTankType()); - if(i == 0 && recipe != null) { - return true; - } - - if(i == 1 && itemStack.getItem() instanceof IBatteryItem) - return true; + if(i == 0 && CrystallizerRecipes.getOutput(itemStack, tank.getTankType()) != null) return true; + if(i == 1 && itemStack.getItem() instanceof IBatteryItem) return true; return false; } @@ -318,13 +311,26 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme @Override public int[] getAccessibleSlotsFromSide(int side) { - - return side == 0 ? new int[] { 2 } : new int[] { 0, 2 }; + return new int[] { 0, 2 }; } + AxisAlignedBB bb = null; + @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 10, + zCoord + 2 + ); + } + + return bb; } @Override diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index d5e475de9..154891677 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -28,6 +28,7 @@ import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import net.minecraft.util.EntityDamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraftforge.event.entity.living.LivingAttackEvent; @@ -48,7 +49,7 @@ public class DamageResistanceHandler { public static final String CATEGORY_EXPLOSION = "EXPL"; public static final String CATEGORY_FIRE = "FIRE"; - public static final String CATEGORY_PROJECTILE = "PROJ"; + public static final String CATEGORY_PHYSICAL = "PHYS"; public static final String CATEGORY_ENERGY = "EN"; public static final Gson gson = new Gson(); @@ -121,70 +122,70 @@ public class DamageResistanceHandler { entityStats.put(EntityCreeper.class, new ResistanceStats().addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); itemStats.put(ModItems.jackt, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); itemStats.put(ModItems.jackt2, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F)); + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F)); registerSet(ModItems.steel_helmet, ModItems.steel_plate, ModItems.steel_legs, ModItems.steel_boots, new ResistanceStats()); registerSet(ModItems.titanium_helmet, ModItems.titanium_plate, ModItems.titanium_legs, ModItems.titanium_boots, new ResistanceStats()); registerSet(ModItems.alloy_helmet, ModItems.alloy_plate, ModItems.alloy_legs, ModItems.alloy_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.cobalt_helmet, ModItems.cobalt_plate, ModItems.cobalt_legs, ModItems.cobalt_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.1F)); + .addCategory(CATEGORY_PHYSICAL, 2F, 0.1F)); registerSet(ModItems.starmetal_helmet, ModItems.starmetal_plate, ModItems.starmetal_legs, ModItems.starmetal_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 3F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 3F, 0.25F) .setOther(1F, 0.1F)); registerSet(ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, ModItems.zirconium_legs, new ResistanceStats() .setOther(0F, 1F)); registerSet(ModItems.dnt_helmet, ModItems.dnt_plate, ModItems.dnt_legs, ModItems.dnt_boots, new ResistanceStats()); registerSet(ModItems.cmb_helmet, ModItems.cmb_plate, ModItems.cmb_legs, ModItems.cmb_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .setOther(5F, 0.25F)); registerSet(ModItems.schrabidium_helmet, ModItems.schrabidium_plate, ModItems.schrabidium_legs, ModItems.schrabidium_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 10F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 10F, 0.65F) .setOther(5F, 0.5F)); registerSet(ModItems.robes_helmet, ModItems.robes_plate, ModItems.robes_legs, ModItems.robes_boots, new ResistanceStats()); registerSet(ModItems.security_helmet, ModItems.security_plate, ModItems.security_legs, ModItems.security_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.25F)); registerSet(ModItems.steamsuit_helmet, ModItems.steamsuit_plate, ModItems.steamsuit_legs, ModItems.steamsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.25F) .addExact(DamageSource.fall.damageType, 5F, 0.25F) .setOther(0F, 0.1F)); registerSet(ModItems.dieselsuit_helmet, ModItems.dieselsuit_plate, ModItems.dieselsuit_legs, ModItems.dieselsuit_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 1F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 1F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 2F, 0.15F) .setOther(0F, 0.1F)); registerSet(ModItems.t45_helmet, ModItems.t45_plate, ModItems.t45_legs, ModItems.t45_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.1F)); registerSet(ModItems.ajr_helmet, ModItems.ajr_plate, ModItems.ajr_legs, ModItems.ajr_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.ajro_helmet, ModItems.ajro_plate, ModItems.ajro_legs, ModItems.ajro_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 4F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 4F, 0.15F) .addCategory(CATEGORY_FIRE, 0.5F, 0.35F) .addCategory(CATEGORY_EXPLOSION, 7.5F, 0.25F) .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, 25F, 0.65F) + .addCategory(CATEGORY_PHYSICAL, 25F, 0.65F) .addCategory(CATEGORY_FIRE, 10F, 0.9F) .addCategory(CATEGORY_EXPLOSION, 15F, 0.25F) .addCategory(CATEGORY_ENERGY, 25F, 0.75F) .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(15F, 0.3F)); ResistanceStats bj = new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) + .addCategory(CATEGORY_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 2.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 10F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -197,14 +198,14 @@ public class DamageResistanceHandler { .addExact(DamageSource.fall.damageType, 5F, 0.75F) .setOther(0F, 0.1F)); registerSet(ModItems.hev_helmet, ModItems.hev_plate, ModItems.hev_legs, ModItems.hev_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.25F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.25F) .addCategory(CATEGORY_FIRE, 0.5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.onFire.damageType, 0F, 1F) .addExact(DamageSource.fall.damageType, 10F, 0F) .setOther(2F, 0.25F)); registerSet(ModItems.bismuth_helmet, ModItems.bismuth_plate, ModItems.bismuth_legs, ModItems.bismuth_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageSource.fall.damageType, 0F, 1F) @@ -220,13 +221,13 @@ public class DamageResistanceHandler { .addCategory(CATEGORY_FIRE, 0F, 1F) .setOther(1000F, 1F)); registerSet(ModItems.taurun_helmet, ModItems.taurun_plate, ModItems.taurun_legs, ModItems.taurun_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_PHYSICAL, 2F, 0.15F) .addCategory(CATEGORY_FIRE, 0F, 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_PHYSICAL, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) .addCategory(CATEGORY_EXPLOSION, 5F, 0.25F) .addExact(DamageClass.LASER.name(), 15F, 0.9F) @@ -443,10 +444,13 @@ public class DamageResistanceHandler { public static String typeToCategory(DamageSource source) { if(source.isExplosion()) return CATEGORY_EXPLOSION; if(source.isFireDamage()) return CATEGORY_FIRE; - if(source.isProjectile()) return CATEGORY_PROJECTILE; + if(source.isProjectile()) return CATEGORY_PHYSICAL; if(source.damageType.equals(DamageClass.LASER.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.MICROWAVE.name())) return CATEGORY_ENERGY; if(source.damageType.equals(DamageClass.SUBATOMIC.name())) return CATEGORY_ENERGY; + if(source.damageType.equals(DamageClass.ELECTRIC.name())) return CATEGORY_ENERGY; + if(source == DamageSource.cactus) return CATEGORY_PHYSICAL; + if(source instanceof EntityDamageSource) return CATEGORY_PHYSICAL; return source.damageType; } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index a031be603..50aa4a009 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -509,7 +509,7 @@ damage.item=Resistenz wenn getragen: damage.category.EN=Energie damage.category.EXPL=Explosion damage.category.FIRE=Feuer -damage.category.PROJ=Projektil +damage.category.PHYS=Physisch damage.exact.drown=Ertrinken damage.exact.fall=Fallschaden damage.exact.LASER=Laser diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c5fd461eb..cb32c226e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -925,7 +925,7 @@ damage.item=Resistances when worn: damage.category.EN=Energy damage.category.EXPL=Explosion damage.category.FIRE=Fire -damage.category.PROJ=Projectile +damage.category.PHYS=Physical damage.exact.drown=Drowning damage.exact.fall=Fall damage damage.exact.LASER=Laser From 4b6cf3473d8aa70312cfb210a888f4d84881f74a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 12 Jul 2025 22:32:32 +0300 Subject: [PATCH 30/45] Save electrolyzer GUI --- .../hbm/blocks/machine/MachineElectrolyser.java | 2 +- .../machine/TileEntityElectrolyser.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java index ab91cbb43..ec787564a 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java +++ b/src/main/java/com/hbm/blocks/machine/MachineElectrolyser.java @@ -35,7 +35,7 @@ public class MachineElectrolyser extends BlockDummyable { @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - return this.standardOpenBehavior(world, x, y, z, player, 0); + return this.standardOpenBehavior(world, x, y, z, player, -1); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index 084aa7859..403e516f8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -66,6 +66,8 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn public MaterialStack leftStack; public MaterialStack rightStack; public int maxMaterial = MaterialShapes.BLOCK.q(16); + + private int lastSelectedGUI = 0; public FluidTank[] tanks; @@ -248,6 +250,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn buf.writeInt(rightStack.material.id); buf.writeInt(rightStack.amount); } + buf.writeInt(lastSelectedGUI); } @Override @@ -269,6 +272,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(right) { this.rightStack = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); } + this.lastSelectedGUI = buf.readInt(); } public boolean canProcessFluid() { @@ -423,6 +427,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn if(nbt.hasKey("rightType")) this.rightStack = new MaterialStack(Mats.matById.get(nbt.getInteger("rightType")), nbt.getInteger("rightAmount")); else this.rightStack = null; for(int i = 0; i < 4; i++) tanks[i].readFromNBT(nbt, "t" + i); + this.lastSelectedGUI = nbt.getInteger("lastSelectedGUI"); } @Override @@ -443,7 +448,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn nbt.setInteger("rightAmount", rightStack.amount); } for(int i = 0; i < 4; i++) tanks[i].writeToNBT(nbt, "t" + i); - + nbt.setInteger("lastSelectedGUI", this.lastSelectedGUI); } AxisAlignedBB bb = null; @@ -503,6 +508,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new ContainerElectrolyserFluid(player.inventory, this); return new ContainerElectrolyserMetal(player.inventory, this); } @@ -510,6 +516,7 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override @SideOnly(Side.CLIENT) public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + if(ID == -1) ID = lastSelectedGUI; if(ID == 0) return new GUIElectrolyserFluid(player.inventory, this); return new GUIElectrolyserMetal(player.inventory, this); } @@ -520,8 +527,10 @@ public class TileEntityElectrolyser extends TileEntityMachineBase implements IEn @Override public void receiveControl(EntityPlayer player, NBTTagCompound data) { - if(data.hasKey("sgm")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 1, worldObj, xCoord, yCoord, zCoord); - if(data.hasKey("sgf")) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, worldObj, xCoord, yCoord, zCoord); + if(data.hasKey("sgm")) lastSelectedGUI = 1; + if(data.hasKey("sgf")) lastSelectedGUI = 0; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, lastSelectedGUI, worldObj, xCoord, yCoord, zCoord); } @Override From fb32763c88397e3a87226c57fbb61066b438fbd9 Mon Sep 17 00:00:00 2001 From: BallOfEnergy <66693744+BallOfEnergy1@users.noreply.github.com> Date: Sun, 13 Jul 2025 11:45:17 -0500 Subject: [PATCH 31/45] Update PistonInserter.java; Fix server crash due to client-side variable. --- src/main/java/com/hbm/blocks/machine/PistonInserter.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/PistonInserter.java b/src/main/java/com/hbm/blocks/machine/PistonInserter.java index bb33d205d..4683f1ec6 100644 --- a/src/main/java/com/hbm/blocks/machine/PistonInserter.java +++ b/src/main/java/com/hbm/blocks/machine/PistonInserter.java @@ -282,8 +282,6 @@ public class PistonInserter extends BlockContainerBase implements ITooltipProvid if(this.slot != null) { BufferUtil.writeNBT(buf, slot.stackTagCompound); } - - this.turnProgress = 2; } @Override From 2841c8b67b8f459573142bbf33b1727f57159495 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 21:05:28 +0200 Subject: [PATCH 32/45] the spinniest of the fidgets CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing. --- .../inventory/gui/GUIMachineTurbineGas.java | 15 +++++++++------ .../machine/TileEntityMachineTurbineGas.java | 13 ++++++++++--- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 18254 -> 36270 bytes 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 310bc7db0..6200eefa3 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -115,15 +115,18 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.powerSliderPos == 0) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); - else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); + if(turbinegas.state == 1) { + double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); + } + else { + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); + } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index f7e3349f5..bcb00ea06 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -100,10 +100,17 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } } - if(autoMode) { //power production depending on power requirement + if(autoMode) { //power production depending on power requirement and fuel level - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); + int powerSliderTarget; + + //when low on fuel, decrease consumption linearly + if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { + powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge + } + else { + powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); + } if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 336ad59dc..d19afdb54 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -961,7 +961,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network +desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 290e3810bc5904d60a3feda9ccae75c7318be4d0..4e33cca35052cf5e838ca844047ae0e55adf1c76 100644 GIT binary patch literal 36270 zcmX7OXHXN)*L4zlZwg2asG!n|bdmrnC?ePZ>4-GxHS~mzKdK@i(nUm+-g}48K|p$F zp$9@I34!qXf8Gx}yLV@Hc4zOFd(Sx^44!E-(euy)005@PIuBj|0Kk7uAb^(oUuEX` z)9!zk*9&b;K1!V!xQ~(1>;0YJ=T44~!9vmkz*^gOJGI_$!PpzzOx(^k zx?O!;S}Zpi3gble@U3OZC?g+bQUeY*af>0+;g=q`;e|H2S$uGSx zRabPO3zauJ%G83kv;^OO1rTa1Nq=9M1~xglIeG2z@40$d|B;Z8i1dn$jqR8wDnTL} z8kDCuCc=Dk5}S1)!MiW1H>p-bC7))^ZB&%|1GoE~j)6z)WeOfl-#-ji?S0f=(9Cw7 z-Rx4~_*K(3$T1lfIM5PV-I(1lJNw_cbH<$v4D(Bf0YA*qv}>Q)xBSuA?AFuR*6`o? z|2+tcpcqqD$=^!?JxI<4?EIV(70k+Re4P+uDe?ew=JIk45Wy6 zji$e2BM3?`mE1F3B|yq!^M5P16&+e%D`YHX_^Gx-uX(R5qf&XwKlGxz?DI|+4~X{e zOQEwpW!_Ss#VFp#PF)W-C4Q~P250m}@#@(>_m)g3OL_J)rR;fIx)wkjpu)%M|B#(c z>#IH|2*Ur>+uJUv`uaAV7Wcpli8gOZnXj`V-ytfsSJhUtCQ5`Uj!2L@)I!(KPIB{^fwjg{>c;>i79aI)FH;>DYYB-%oQr zZTV+v8ERcLf2%yn)S#kQ5itilECR0oWLSSY*>`|E9uYnA5-2Qp{TlO&Mq7=``8Fq4 zp<0+gZ6;MW@cm8y^@(gx(KuS+3EiygIr0N#&v*p>V~MWa@Ca+MjA%$Tc!bkz`O(rS zGR|&j4*P0qkp3$_DEQt|n(n+iAH@!KYnS$cv%-THXeqiobK3I{LeO5J-eG-USQPh} z|D7^iIIa!%nDIRSJm%cwVhBLoYoW;tdYKcM@RvqMl!>|V(#PGrR*<1_F=6+z=v8x-SM_d%cQoN;&VmA2VBlyys8t=UT`WV zVGT_wcgF7D4fd0UKq(o0*7krAdoA(%UThA~+zZdbKRyOInPpPd=%v`HDZ}a6KW0Fy z{j7)eWyF>h|DP@^Z@!S|b$A)vU?iabtB_2n8md_U_C+Z>F(x}K+q7Prcnn%AWX?R# zv)UH}x5<}gD;tpf$nSZlwf*@h#^=?LB-reUsk&n3dAyFUidp?gGvkOyB1V>~RHizT zlxAsJuifYYmIq70m?Sjoxh-R0kieTR%Ii<`(tk~}FD$yhVXGagFHy7d;Zt{Zx<`>E zs;(G)bZ}R9eY+RrBd@{#j3p(*wd`-y-L%S1iWA5*pUP7U5lYJLkA~AFvb$ZFFOC0| z#@4=McBCA@WN!n1Tg=`1{UhH-nK1l_TYwn&juZiFTJvMB{^391JItKah)yzadWev`|`W_sEGgX*)(JW$6iC(8v9 z_oC>tIn;*~^rHT=n1Se}5S6)@Pec&$^bb@sF(TsDD&_T=SfCjgr4%XQj5(Dq&Tqb^ zY2Lab42h3*d&M|DVTe{6$DEXlJHL5i8FJvCRaEQI^^kiU8%l4MOdHE_0_YnYew~Hn zW%eFf#2hsoWKcWS3l!9Vb6S{FB*r5GH_GUq>PbYp|XV=n}^RjlJ0j^VYYZbOHX#A-L%3V-KE$0EQLsEZu;7_Qw@;NSF4d@M)_DF09|&8E8vL@g*u4){Jzde6$0N5_V4X5F874pDr{ z(y965tAyop=Kb~h2ANyi{WODF=dA=)4wRYmR{J6w zv!V@DcD^)Z8N)59RW_M+r%3&4(MAncao#{;uwtyQtC(vP)U*%Vn^tC%s3 z_|rd6w*+)K=mYGK*yZL-t4K;bPZH;h6YE`@82JURr;bOT^zjL`k^M7jQmDx?6<8lf z3e(D8fous|cCLtzj?nUHo5A=zug_fBIYP?0OgzE^DHt#4+Wpg_`1er!os&1?#G{nd zv)`k03bjwPQ2b9mI0HRX*S>eLiLz6ETjPqkTOtjPS5dO{dMVKWME!S@$#y;gRD8YN ze_kXn$m_^gjB!^sd9_o$kAIy_aBgcpcH(pe<30R6kK>(V)r!`e7{44WYItNgf~Ht0 zG{9TXu?p8RS1>Yq`TWfaL7laCfI??t@%Ss4mzDR{M;Xpi|k&WJr= ziDL>gj_Euyows_xvr1YYi+6d?&`@0LdD2{m@;NeF5dXrKcIV~ihpM-9UP*$V`e$}= zeSXya3LTa$XuyN~H^R?8$7su`mC@YDA@O;Hn$uAq%{|L8A8aE`EG5Z65v23YqnL(A z<&}jr)m@9Ro|nu9;h~ZbA{Z4XRY$bES4(Ph#g)fbup1c6EphLPUpZdv;P?4+-+2qM zfXVo(O--632(g~)o;GC_3;UK5go}fjDGt-@5Hmg>1VS|)2IPjhh8?-{ z@vII0;BX%rW`E#YqXhx;C#c-%@>O$bEst0adz}_JLNQWAaW_ll+s+S&d0KGaXFWBa zA3An|tlK(TE%z8GL7Nf6kOilG%|f}oT6|i0g3tcLYe7fbp&0Ly;jrw2(w?&$5!IAM z?e{-XTdtVUW}%yMiN^r|e6I?wTd+$ z?ro>_vbx1rjqh#C?zgS}N@3#BGm4lbep5UBUV~Ct7=i=I{m@I%+bUdHJVFV8{P3bG zph^V{mEU!jWm_o~R1ONQ{5q;_X01vkLlqTliB>J+}g+bhLL~3Cr+A zOd}6V@xuKqz{P^{NA4K|WP@9i;ACMeDQ^c@$ddG6yO$q0NWz?mLb zkh%63q$*PoRwD?_bF<|vkQ z?zGJxDr4MSN!f1@DdGASKCg0*fVP?rv;*%7Q{U``FgVcxVzh3+v{-h87@t>&08U>> zf^h*WL`*iXNZ{f?3z|wRB z(XMH3URG`Umz&qw)+tmV{2%4lXpa6qmv{wn1ckOp|B;nL642J9s`>0;&gFT;F zWJOm`>Nj){-RrZP1wINcqf)~Lo`wER& zbdJ{=t$?k3Hvpw-@}y)d!~7ps_xZ9Ez18+7t*?uYPiS0Eb^p+HZ-RYcgo?J3^2?h# zAHZL&hB*$_t{-fN13o0L$%oA)9N-7umOqUsr_4TdA~7@cxz7e*4!SX>29{LBU?t86 zFqhiB;A@lb|1(($2+q*{nNpbg?+?CiKN|Yp(Pbf^3x+!F<|?RIc?B_$D2abb z*hG*KZeIaE;n$0@>tFF0Tx&Bdu92vjt4LLo;knz@J3V0Z>d{~{;_~XQkaCT;u%jIc z*8YUOphH`hQ{xk(;Lqug+T#mP48c{bKSRDZe{Z@kL{+0bCJZxxX~h4COIYU z(}=99j|9@YnuAU-qvaP0UzPGyv&WNZf(P--rmF!^=-~4{H_5fnSp2NX=uV~aUf}4z|)Aya$V4%4!b)b{(-1m zHk($sK$v+rJ^S^I_Df8@>uzU^YVc066k^uLx3*EiO`QpT+N4gQ zF?n6n62HA z8EwRTi|=`L(`jl3x+L1o8*M(ju35ibA%njVD_q#xiU~x`FYcZ(vl!7L8yboZo*Z`e z$hp27Nw#@A*>bUSqpq%SBL1_cs$c#A-c*d=x!0VWtz5|rfqclbDgWb?A7 zn}oWhkidfq;e(~~jp%Uw^FcNV^I6Er$cV*~f91&H^!)W0YVcL3XFn;qbaHWBCCzkU zVd%f8AYxJB!bBo;Jwfg8dxpim28KfY#^g_oU^ zj{;p5Ct3z2Qa8evVFqSus+%JLVk=u>n+r1)`FXqO!00f8H_ZpXGIE9@BAoW!mqJ$l ziaR53gRk{P(07|GX+DK@nQGcl!GZ>_MNnE1ldFZ|pM!rD3d9Vts~ovBcP5!y!?=&c z7@Y$cR>7@(h@!VB&Q}pNdjLfsM&JZq1fPr-#aoX>~Ui4gYNe} zdW80H8@E(L{AnTT;Tt-FNek&l&+54>ARGOv8#U&IqPwn&!7JYcW8g%4ua2yY5wh}+ zc_&iH(x15|74!ljvq?#HeQ=5YsQTG(!+NWvqJm0t!JeyEc*soo)vsXJ+$E>W)DXp5 zC4muhp96z(5aePXf-?zz~^U_+_u_iXYd z`V@z^rCAwiS(&&(enj0y+Kq(&76-7J3dbXlE)2kvqh?yaigm|9FkY=b8eEGMA#UQ( z?GWR2q1e2V_a8>fA_F6)KF2Q@{RoBnT8=WNCO8CKU`v}M3BRyinWO{yOc(^AL7IHycPf=$W%yL;2-g1`;I;F#pSB*B^E}KQE{VD7f zL7xylPfvQe`i6|?`N?tUAzr(cHIct+zzI>m7earxAkY@mO~2>kzO5)^1N6$a+l{z(iI+z0eq#g|{V9YA;OwC;%a?AoJ*mE-#Owv{IcYRXwIEnAKI)+>u1UTwCd${| zhKq*}WUDDeVvq^-fL_6@n!&ZLpJGn)RtVM0J_FNYGWE3QK^X8fYh`0 znTOB^ef=yN6uqKd#a9hp1u$}LD%Et$%tnB^b(2ZcLXuzrbCVFfrHNFxZcqbD0(; zsb710rq&B^c3Xtu4FFsVqEsb2cW!+8+74=$VgMvUNmWt}=IX^aNiTarFl^3ow_BEl zuS-h_?xO!WJixVAPk*FQOVJEN-DuKvU#TRp07Qp(mpXM$5{chC|!ej410`yd{# zp&R(Sj^4y*j{*jm+04T$BCFNQRXHSXl@}bI?t*KhXukJ9`972a7k&^TbZYkU9mfX= z;s=h7-*i+X*!0RUR#N~ggvBuT=THf^NcG|x3Z0bcp$f4H2-=|jpFbYKp9zxQv~gl(l`XGd{yCn$2vw{Ax_oDcY%p0)EzR7 zbv;;vs7doJ1b0n0&@|hgCXjGmOCF=cxKL9!I7=IG7?-N*>P>UT(v;y^-+}hWYQP6u zvFKr~>Bj!?%D~g^FM;ct3UL{3mh`8Ldpz!!q{9KfJuPmQ z-IZ%bJe};+!V1s6r?OO(JVZ(_6Fn_DJ3r+pDe$dFKmMr?_&tmvyhmQF+rJ09JQQj}>`fif70*y(3kEGvuI3h?vYOj2*`Xg!C` zqOkE7_nV8tRv3LmQI8K3zJ77t5bi9_!3Y9@8L67DyRXh19;r|0+9u6^TF`vAnF-k{ zf~)OjWYbcJoSx(sMWmCZGY@RH&>`*0otc<)Q(bV#519rXH&SQ|y8T+jt-w;uuXZORdqN@$x8 zPiF^02gdIK47GI9HlGJ<0KCnZ=Ag`-Gh?bTE+s%@s;I^HXyZyoci3008F$_G*G}eG98fpq+2Mp2Fv_1x$p8h1kQt3G+qq=XG z#?|>l*ihgtEW~OPG)5+zCJEjdg5KU{fG~1VlE8izd|K~mzbR@yF0lqeIKyavD2Ec# z&)Hs6i3^3^cA|esJS@3wHTd|WVD}o=ufJ_<4#6vtTo?833+m*_pC=145JB;2qANO2!rnP-87(BjnsVHz|N37?3 z;5-CPk4fD^N__JSx&WQCeQD-rNeKAMW>9lWTRtQQNCFJBzz15vhWN zP{BJDg_fk#Q%U66#h`uAs49hnW6Zs)QdOM$Qou&K!Iv{~m8|>PcHyAo$s#fVgQxd? zibfpJAd;GazVXuucuE!Rl9m-?)=B`3TmL-a8%-$K(Hr5fPOF8CEXJ1ueWx-=+Swt! zHTdd?6lD5rku=b6cS{C;)W9|^1Kk!8)pea>094Bk`eTmM?=C8jLK#jQouX9HEQ|Qu zd9NBSK-R2D2weYBV_u%d^z77%N^tc1(WRST1n^VcC(Wi`bLdfkWW*f9SNp`4RRQ(W zC&p(KyAtj64yRr8l+WoIsf?++Pe$|afpuZ6@tFH=w282>--|pT2T7#;klebpLvf;h zrUF+#C?;>SXr@G*^!L4oE7% z*c@z)CP^@e9BWD2DzCCeGjQC@bqjDrAx@p!_;T4AJEC(;q4G$5jpm6>32pl@%F#A= z`@klo(Q|8rU)~y$)K)FMFJ;w{aBz_oua*oPNno4b10 z%?=NheMug4x%8(Mvl@{Yk!bjEXsf8Kvbu4E2b!F#EL2~Qco|!2U$mBCNbDF8J~9fI zZv!9YXWeG~zIWQe`O%VxAGS#FKgcWrh_)0nFdY4NK`;#!7S>gwGn97jfrJ^_t))jy zGy&q~4{Pu_uK_{6pj9kCaD(xn<_h}#@GDBHF&4_MOZO!*QwhzHQ_Wo4BPI%!1RrE!C-;oA0ngj%~K zqGbrVit7G(n`hzE^{Q^ltPAR-GG8qUijZ9hHejymh!s>Nmy-JD6PB41rf<~0$HU`G z5g2G@YM&#fC-FIwPAhtyV%8MNuz2LY_~PT4zQ%9hR|eJx-LflQmWN5tH35Zrpb(|A z2Vf><@PWU8nmtkN9TQ%MYuwL15@7vX{FMc>WWY^xD)EMb6`N~4Zk)Bl_u8Su(SXA> ze$>9xnDg`+D}QVp-||Fy$WCEMV_xMB(2ZiF<6koU20wH>8g;OG(VUU}_3T!kO2@bT zK}IS8sHgl8L9lTpKoKg7i;AZ1B$8j48h2v%Tv%+b5+ZL;|4DA^ouA_pXV?I$TsHV| zOZyAWzwYY`T)BudeV^m=(u*JWm!WXMK09cjCCIv4S3oL`8{}P6pMKbX072$n2SnZg zZCPj<*qsT<-MYmttQi0n?$w-HMC1~I;J0^Juw}gYS13x?FetD{$p!cvUW#gMkvP6tv2`>-;6+uTm9TlnK7qVb(38 zxwD83u7jG*oE92_F)hL5etXzYYJoc}7R>TbLUNfqSon3wcGiC~E{g%i)thc~VK>~S z;NCd;F63rHj=P+Tgf%ML6bBEC#z)IfShU%YwaD8A<{kb!#QIN7(i0qpbk7n;8Y(`1 zkfyY{Gd5Q-I4t4aXt+-)9$oG|Gqu?m9KCynITBd3;L9liLt|%C~&rNRM?HV0Z zjLZF?C-ZLCi5lY|u-YWFd;m1o1SmRz&1KyP4wPh0wtM%k+Dvl$wdH*V7zi--p+4Oy zYuWmR%oIJDXgiifCpzwe{2dni`BlXc@LLk zo%ZPi&){j)W`kD0oy>Q=E-j=PeV7`vr#uv^)RyO(s<7KQi`n*@-u{EIgH>ThsxPcT zd#gI!)M`Gv%_KK{sKBCdv&X1=IrT5~F~;4rQVmP197FJiE9;&bUDv)BI7~YokLx1%Q~MGO!qkiyR`Ca37<7dga+; zJHr2=6Vjw1kNo8kr%w8u5q7ETu9O=aspv4Gu}l+SbCz#SNX*L7S9y0G#m6%D#jorV zB`MzI7N6xVCD^i+ki+AVkHNTlyAEYp@_4^2;8fg@0J#Tv&Sf2TQ3o}MTBsQMS_W+w zlQtMo3(2UF$diI8SNQR1QDkbH#zf4KHpa+eN=& zrvxSYdV6PQ_2NLI3Ds)aN7Q@#bj&)ELc<4P{_K7EN=J8@d>o*()*74|%)b_NjIKKb z=tw~m7hhC2lhFH;GF7ARmJczgaDVc+u2f_^Y?rG2#Qq`jvBuQCPx0~7Ep?K!LiYM= zYs2f_33OU#EL&gn9!wT^Gm09s8KgJgI?+a)X!rBlqyhbx^K6LEs;3l5)j?Fm`>s?q zi+3#<$b>6WU4a5rz|zFzAgih?KH*utn;^+|hOrwDn5DV{j+kMUSAeit%=7Q?_-b`! zKTY0qb-t&VuWD~LAC%~X=L|sLlX$mmUU;R=H#xPR`q*i{dml2AmBR;*Z7r?fRDkJ4 z5vFR**H2t%=Fr&YhZS(}%`>CKph5NEm12@E3uG$SwKLf63}!q;lBaJ6OZHPn-W;51v#`w^Omz-V6QeRxaA z#nQUDz3HQJuI#JYj4xkkGpu`maDo1W)^uLe{=k}jTQxJnDbDXF;4|l2)EbR2)Fk_o zvO{)=zkD?LsN}WB#k;%p9QL|6Cxp|_h#b%FE6wAB_ZgC)EYz~Tr!{^z-Fkp@(fNo# zcl7o7qayv4s$?>E{OF9CuE+T;ZWG?Cc(% z!tsXmGsJQu_DG~G3Ky2L>qM0mk-+Jcc>4K`6z7e#zzCQ2kc&1oMeKan3*(K(KoxUS z_-`@)PZFtfW{%}j%{OAGEl=#OA}f+zhmu3yIt$l-B&NGF_6yx#Lo82emF66_OfMt} z(|q-z=T4nnruL)HN+SkyT3t7p8e#eK@$Z7Y>$lNsIddRlKW% z9fKiv#&Xh0h0pvuJgjehxf5R$>h~Va5)ARgM;nh}p*5y&fnk*>%_MvJN* zqHt1~yVwSV!z&ST7QcLKySyC80Jw6p43sB)IU*PX2#M;4eg_rY2OiFpo&RF?-Hw0B z@YSkOD_>9)Bf;aGqpXFK=QZVH|32Mlw%vnV&M`7A+d$=tW?8ts?2r% z?%EHyq!{7l!a3=yW1{cnyEc4oAx{6@E&;kVJRQ}G{$T9{bkL8iE?GTkejBqDz|2m| zJ|KI18dOZBp@t&NJ?yLSS0#{jfQ>K0nqt#UfY){{# zj7U^h-VebyL{@Ti(rC16vAoN9(%R(|@-J{*JfEtgv_u&LkhWS@iu<{LLPsk8&{zQh z#nid7-r0H&VW_*{KP4ZE@&GL9wjz5RKdHy1oA{tFe44*8H(BUlDLM;YoLQaTaBVm8 zzfadEkY!kwl}4bf&+yJ~)s}W;=|V05;(t-(E@hxpoxMv(CjO(`LZw)WepeEzNCLSN$su=#89|-V#pzx&0qF- z*8W;<05jdN&2EZPJi{Y~?1S_+43xmHf`ykC?d&QGfr#wrXpZeeWlEa>iwh*E?P_v6g)3+G1vnWgPI2V3d^1tN zgQaELVp>^-wf7i9yaoQ387`=74WDr8f7-!BKe>rGps<&LrD>{rR`>8DO6P zGRe(ac9&|b)~avB0?EKZ_G`ShC_%`Q3h7W+Rp#6Pv|o&W zXisds^$p!*WU9l$gKQ=b*&d-bbns&yG=fsqgMA04rJm~-!&D5&WnBGWQvjxA5)^6M znYsn;uJ6q_(F9LFsT%CoW@XL3Ar&dl8q;5`NXFLa_0bu|zLb0by%_ENWcw*q9yX;> zLZ@La=%QZkR)Fr_R&h?xWDul^OmeUfQrKLsV!P7~CBP2SJ5WaFP5bq7vG{*@HcH`b zQ11yLZu{`hF5!PSc($4G9p?8N0P-2tY%HSJ+sk(x%9zQnnPO7CE*5ld94T4kxgPSq#BI@R#_-9bB7ZqH42! zUB-dUWx~{j+~4dAMj%*W&28V2B_f*eZ_0kl(98?Od5T-(X5o*{@uiuWYEgTIr?cua zg1zKX0rmC$^-md@LyOR{N8%ywY80oQ>MS_r&D92w#;9DkqM{`>=e0O1 zfXGdMZI6SEZLCtbwOvLNaJ)nxV+R5mPVD-A$*t9Ncf>!+69Pb@D^qtc?$bk)8FmG8}^nWn>@RM4b9@dWS z2Lx-)zG#_CISRP6{Uh|@v}Ao+Vq!hV<~+K4s9sey^{?EKYhEpT&74(amq`RGsP~%#?bv{cTC$4s zQjfM6M($-I;_C8^8VPW)Uyn&xUh=X(`yd^R6Z?M1!*{i!*m{>>%t0`wBP@~7OB_MP zv_Zk_aYUM+VdyIgc7Ar<4C9iws#$xlzSnhzjYKkZc93{4QY++wsC%Q{zrFr!0H@wNI49&Y5T3w9u_=3jcEk`Nx;)#|rW`j8_ zlu=Uv|N;t@Jx=wa6@}JgVtHmxYIqaGfmAadcE_>(r5BcPnqK{G5*LDAr0H} znlMi=MAB7@(X>#6iZ^l~x7CuoXo2sW4;*;rV0)9<)U%Da#?kTr_xFl``M>?m@!v>a zhMu0(g^m6KhUj4KE0NRM&i*dj=q=maUcTxtypksvvk`VF+U*4aWI0HyfEC?XUcH*S zwU0tj&l?HhJT{e-4^pyhilDtc{#Ms2rm_5zLe*v_+FcUhDW&AvKEp{3&IiLWtJS2` zu$-Vj)RbSiu^`4JCou#GNj+#!pXF49Y~OcxvOF-2Zd#ZZY)0vc57mq6XL{(j1}&KL zrT6)=CYXCm>BTixq&|l4oH)XnS7a2i=Rzj-_5_lcAqafcAjf5HS~T5qKCoTRaS*v_ z!F<|Nt~fy-%6)xq0m_nHaDB3ytv5|tG%>d=fyUZzd9;6aGh0&vWD*M4$%^mNO{)D7t+w@Xrm-M)(I%Rv=4P6?yT{_e0pkwMqwKk8v0T=*!sbU& z-s9y2+f6Br6}xY#8(iS#r--BChqSY5hpaG=a53mRc`H0EBxaLI`V5IR4#^bwUkB#@ zsJQ9#I}Y^4%&;ALuQ51}BS-~E*P|`2zfO=F4zPR6%|GIzns;6(aDF5jshkp zAOEA5lU*HsN6`LP>aI)or=#LwSKG-sblb-C@2Fs{wKOy*KJ_i;(^1Qz=6lvs04vDy zNe^A!D<1cf7BQQ5lmIEt;N3(hhX|i8@oI6nu1=}@dENAdO~_By)rubZNs} zFt#UOgO*R(^ZP1frzh8#)il1?o;6yiiBgVsZfVn&?&A|BE~t$vHqospg=cE^HQ)`f z;zumymuo#P_CXhx z!S$0X5{505^7rps2myW^xnU~Ik;(u{fEF?kS1&<}EG>oLyQf>XECN(W-=w|_+|NS_ zbtFI)F4f!#spX6NsiGI<_H%mrfnk0}h?T8a+#*F_7wSPdAa%aw{z}bNVe5sz;tJ|Q zBAal`P+U^x;2s5{1*KBr8F6r8e8mj9m68VGvPJuHhsfnYHoKC1lV53Nk4Zl$rtU_Z8Z?0}04bV3!7 z??FiOSX%mjVSaw6?}p$-4UKBo*@j`?2xIdZ#%aSMkW9RD2h!a;{T?7l#e}lE4%=s& zc@vD4Q$&_k&fbj~y`X>)rL*ADycRU65sb7Ix~j#6E$B7`f;5k@?+tM5TQz%JhooluaIh9&JJ*0;7{NE_W(BN zM|*KSv*kp6s-q`pjg1QW59#^(Nnra&?F6F$5)v*N7`P9f>S*-YXuS;7n>#~gza&Z= z!PaR2o*ox&Tcm0Ci1STj`KL`_p~Yt2h9a3$FWQ-@c8HLO+x$BGTF-!;3KYJ>P!R;Z zF!Xeq^upkefsg>mAxv%vSbihgL#Y*ljhyO55LOiJ4=tQbb6CQbu^ew#%(9ITET#Hk zGWy6e^(*{>m;S*UkAIvEAV)cTknQ~D({@%XS8L@9Ug@h&-lqut5MNr%TyrhTpdI9} z{T^;fSmiQ<8znlWXZzOig=FnBCTk4h_j$a#nyNequW6VGn?7|-I~%GC!*2CUX#CRE zLwv2EUm7V7alnDgf)dcKSDn?Q3V3i@ARfN3@7m~MIY#Da<-fSG<#?%T&?;8Z;}oPZ zhy>Gy5#JcS&pBHwo)nRpF`$|ay)Bg_otrVh12gEO%e*PIU6KnJI&o@9tgJ@mXaCK- zmM)Z^X^@vbElrjTi+QSAeLVU;1ZFlv_oc4Jp~^sF#`kIff7)nCVra3o%~9a7-HOs zkg6_}n86D_KIU+J+t9<$)3}KCBMsvcGOFC@nV;#`7q%WgtZSA>5ryF~`vGyY8+?s8E)o#9*oxL&3vxV?5wP6oRQ32)F9BHx1nwVD_#OiH@O5(dx#Pqi zG{y7)dG&udW!!1#NRP?k%TqPe2bA8mD1omU`StMra9zw*Wp2r;^J9g3KeP(KS(-K930 zuGE)XxZVe?npuq;`;2wU^34joXc$p&)2oi0y#l(~?(S?eCt%3r>}7x#$QX2CG}_#j z>I->bKr_}Stn?10VHRW+2?~^z7f-qk__K}_N5%=K-$tI5MPG1^*9$l6xCUo+aox?J z69@LiyYYMcXBoRu=aS;yQ5h2r(CoUto9l5g1-(jnp+7nht0=`6+#gKVCr|1HR*|Bw zI-3^i5_5c(AfA(YgpmcgG3?!WxAeeaB?sX7r)8TC)nU_kB>lCD)+Nyx5WW;REJ&->v2kxJ|L9kt6y z1y@+3&P^17+X4GYu&z#{`I#Fq+p8t`()xZ(8uDznpZxB#HB5q`J?uJ2wTR|gDtOE^ zh_l;K_IYZkIP%dFIw`99t2$Ly^iyMo@$bXcfT^%Y;(+Q_Ln&I674z~Iof~isr8)ys zBd)!~iH4l-H?druw|R&@Gk3pKZ$h{7y7}xA6862zva&raNgGw67YwmprN3RkNeJ(t zsYDW2*wWO}Yck5xg+!GEMXF;dE^*&PH-BH2;I^|D4HgNjKTSuj7NgsM;TKZziS=DH zXOy~Dp6_L!o`qTxpo^P}_|_aBbk*#Oo_|6fbpN!47YBzNZfLv8)z9yaGdn1$ZR_Tj zhgRDuqjfYBXpS$EMg5vUpfwwf*z)%^nGHK#X-w5aVj~?$nSna#-^ZnW`sk z6R=2H#49Yd&T8BcJRgfTA@@s>-#U7@&Stgw&Bc#CYpSvzZMvMc*bitrM{h!oZ%;$Y zE9-KMe7Q*K{!(_P;i_{@nr8Fk58-;IZhqMP-Jo?pkggRROFpn$hGBD^(0^B%{jJ9q z2gTZEG3F-Oo{24fLwobdCE*f#j;ETKfa%3lJpaIlS_22`kt97@g7o*jIN2XF# zVk=Ygu7_Hm($F=evVIYYVC~haW&fk7JSkO{1WFR`1BllVyX$TZfvzgMoV_AqlqX{ag5wluk>cff6~$bniqiVo}+{Lyk}j z1a4jwogRCPI}g5ebx`5}ZC-o{^n5?ExAU8iWi&g-(+EFO_T`c~xOK6sDY}y@_{`gK zf6k;=Y>}JMl0`s}2@~=ZfuxdN^sJdzo!p;S#Wn^8qIXZKo6dKfS^#}^#B^S8+?6Hd zQWQ5-!GT+^vPTO@QGQ`uNC1IZO6lhH05h+VlS$xR%FlNVnRqf}-e{qsxqUr*6VR-z z!g;g~RNC}1D-vLdbt>77?>5Bf8&<3gfB}HB_Il=AUgclIIh!)ENA(bdg(e`$axd3e z?Aq>`QO$=SS|ox1N7Txr0#u~7p5`#{;4}1Fb|3Zjq9=DhHDS-3ue!GS{9-6*0d%0C zay8`*U!OWpY{8@&2p@@Oo0rTP%KMh=vfM$rk5)a&EC>u^RumM zZ&7`#7e%lPn*~$$iu9Vf;r}c6GmGYey!+4RfH0v?${Vy__?W-_7#5Y%1mE{1otdvk zt8Omz#By~R^kws&xQt(}D8wdhPLN&c?2C! ze^b9w(m^1ac<>Kw-hc3_>a+)k@zoipk3^UVpKE0@92IK|xSDB_u|d^hgn=bY=D>vi8(s1>P=m2Y*cwK(}rG$+0Rh`^@*`)_|F#_Uk>i{9Vf3b`%Z z{4(XZN${Dg#Qdgc%TO?dc{~7zLjoAEAIf)4fqI_Ip)?aRn$86o*#%-Sq~qe1*l)YW zg8%m1FVo&O`~SBe8(Rffh-1z(GfZ8>Zg^zcdVS7K8((4&1|>i|zD1`j=F>y1m()Ob z?Ylzyl=XU!3K8U(3StE!!rFJVmWf~m9Vg38ZtXqNN?bu#$R!C}XJa}p>)zo3~Cm;BEfNCUkGJ#ArA@7~KljXZl3Y^_jAoNYP2@5%w zvcq;lwY~c5A6j%D!2=v+vqetdnrQmtFr5@MmtI<^qF_=D-V@1-U%Z7O z!4d&<24y5@LuGw+!w(eHbxh&jGv9UE2C~h{D8sFS$-r}U+#k%{elj!aCV$1|wO!C- zwkw_BA|YOT`G5~_ z1liLMc(cbPWo@(PJlO@pbhqIh^pCLGPFYK!$zFC zK)cD?MrM(lA(Fd4t8*Wv=CWU^enLH3-|jU!Msr)g{2@?9rGxcf>rVD}r|tfTh-5Ee z57b<_n09bFULNE!!&+KI=#!MI+pzI+`tv1WsP!lVYQlut83n*w3!lH_JQK*;LNY5y zVHzxw(rTJmd$%Su`=i8Y+`5d~v~nw@EBZe^ET>hY>o0sJ8BGnr2sMi~e@mNEayt@l zMJKGCJtuQYo*`E}n1d3sCAkmIXPP_eVP8w}H|NK+sb$1Wtetm*Nt-r1@RbQdtI6`f)lQbhCw z$M~ZL48EREyJH4I^Pr%>`+A`vo}Mb>5n{T*%!R@sPGJz!1~Ce0T5g-{r9eskXI`LL z|NJojuE3}E-U+6ErGn0fQG9y>;Jyd<68N(DN(C#6R3`oU1$y)pa`iAynOzq+*<`P* z*-~nnGLJc^>~&p|^wWs1TXC=ddO82i_|K+OD@>OmWIIHUaCh8U+kswT;LtKfI zwfXxGqvycUKnNm)GB6sjpbrqvsVzcz7NGPp`l8Ds4CxC*(v}1Em;0j0%HUhlGjwx;MOn#@hB)D zL>r-{@jzYri!U*uVzjUfx~9n-Kdy(&V5k&$=~yA5i8Fdp5M@{6A3fb86qnP;1`DZW z<#?kxLI=l3TEKKCqhu?N`v%|BD0`47KR`p0u4@O3z4q`GRta4Wid?&5f$7djd4CBV z%rz7w<=dn;wpCV8E(Wp#ZLvd@YQ$aYdKwgjw?D=gvD-}&C5UtQ5GjWfipePgJK;no`w#V1~7e7<^j-zlty;glsT*E#Jmvt#{Qx>p%i*_zEF!1-lh;%wnsPnL;`d7 zVoqC(wsYzv?O73?KObbVH$ys&Hh>yqvOUrxt36X|Sq;IS%|vsX-gOWp>Zv|yp6O1k z?6JbGkyj5EJQ8X1&+$=wd7vs_!fc@Xa8501jB9vALXBL6%77S6SV3#2EGhSFqaC6^ zBm~NTxq~bi7h{Fgl)gJJjLo49T^kS1HCt-#~mo<1oreENiI+T z$zpnP!~e8PR!eK=o1VvvrLSJawn!9DecP#}QesuRFMv=yWRGCOVEy5M^?ePV- znqF46BP?W0&zy`yb_y;vUYSPmKC%WkvpL3Wsv00L@ZhigZvu(f?#9FButAuYS9*+! zj0fQ7rm2ucuSDhLAnEqJk9Kt=K@?@o0L&EiKhU(RM;M8J)*6AGcmiISus zpZMp@VlUir|E^;;#@F#y|@n03fRwO@Fizxt!v<$ICe2; z-V3^Wk8ciX+W&Wh1A zL}#BHuqZfk2~F6h(TMz07i=ZYa>So!D;K?Gh0g`^oj&bwas;6QG;Z6HO2j5$Zc?dH zDg$|nd6HVs-xkmQ6eA9(4+)kn7b8UQ!N%-bZZ-P&uNHn@9?9=|j5r)>NB&@2jI^2- zgV$}X|7JF096$Q4wlGpOJb<_S^ZcT=-<vKWmVHj&U2G^>@WPh7CL zMmhT(otnL`MEH^J(%Gvl=_jhwZR2R7teVV67b=8j><=3=rUFe{+Kpi9pyxn3n;rp9t{3i zU-QOee9kW1Nj4vp9(F-VM6}8#l0;KgQ6^>xM;jmGeYp$_Y_*J84BFG*ymAiM~IWmxSXuXeD@(-5&lx9}QuyYjY6LuH&HEWvB1n#Rk z;NAk4oj)Yc_GUYYqRj}v)gF)5D;|py!&%ple}UrVV=n=JlVQ^VRBqpfTpxWCoSzLC3U5je4lX*P>EueBhtqPjP0OI{Y-?p@!8IZ7N^a=r~h0ixnM>KxK`f2I+S$ewU1cvf_G-M@?7go2j>j?`5#_e~&-FJsuNF?Zcl?p+@XsmMT5DG!exxa&<~6?A;HyilIT( z5}G&bo8}a$*nRCLig%o3>{$F)ZU6UPu-MjZ{p-lk5<=DoJ+zlj;`k+(R@G+M)R})o zcrehsQ8;j>;c7T7*<|4j)SXRCBSDC(=UdNZJPcWMvM8ThQ zO(_QMgMv!R-gkKQ_)~-)3f7M$S@=Nf&48z9&dow@s&S%kjC&# zKHiUlm`uYjL`>*JpbwX-%zJ}7Qg6AAjgO6l3)P%DeeHt+A_l!uECE>si?gbg)He*T zjdYQ76#ojj!co;5z$93W>y?oXcX^bx@QpGD!ih2YtpMTYhvjVLCCu6d3qtS}F;g)` z018{?+bX+catuf?3?~q4%{n<&zgPI_``hc82d|u|*X+xb#}IF}-IMVVB34&aO5Rt) z9k#=u-=R?3AFsNT8pN55sS>CH5i1F_I;^}<4Z9*~GZNO)CRkyOkBmjLfXmG?Z6|JJ zb>aT`7*-ol*0=jl@*wh}2Ba+C?=Gb=90YE9VFOGHF?2>dO>#4U--#g35F{Bkfyjp{GEC$`uk#DeYnYw zhsjS@@{>+c5s4Jrw_H(i&Z*7L! z8tFS&6kZzcy+0b}(8{lA*>4aH@55}=sbeeQn)DHT%T{^Y-|+JN58B&Lm%_;1E!Si1 z=d6$=iktO`0KAJ4=ppYJa!#$0g3k=*JvK5kG8t3KV4_qzF_zb!JpRrN9gJ^8O;Zph z;`YJ_lJPXzVq$?F2i+3>z6qaqc;omH@B0>Fa)|4xsWlhlT{GMMpHY*cIBv@mc)|RO znKO&Z4x+lTvzeXwBrt&L!IqQ5D4>lR@<;J9Vv7;**T-|mN}eHcAw6C*r&9gjFO{pW z(z|yz4>~*j?igJ8EXIc%oYgFAg~Na68I^wVLcMg6&c8@^@hn3b z{ZX+$?CKX^b?Pip2o)!-rNv;JPo}O)nR{_|Yu16W<#FZ1&HoN$>$T4#oVWm9Pzl8% zQ8a1^0lDsepMmnF>x^d=sL*TVo+Bc_vN7t7P5k%ut)AlAX0;_WdRXZ~Hq*^cks)dI zDu|xIKuy9-pwWHLruf~Z;l9-=fn;ul~04!LPUh_E5C@! zpadJ>QxYg^|EH`}QRt)(7QC@p=^Mjhq)cn{EpoF&J$BHHmJ}Wkyx9|wui@xf~ zt00s&ShEVcq^TlFxhN4Mfp4pOuq%Y~r{XP*oG8F86tJBCsmQ05q?tcr_fEW?*;7x zJa11&SXKl`_kc*jNm_N+jUo*6$YtlyE(0zTiWk>_RO*C8n zw%ql#Sl*`z1>DcQ=JHoTsv-8AGz|{}iRUwmz9(*e3wC|A*T#&!V;1fUMUgFyeyFa> z3QE2lMg*g8i6=E|MQWLx|OBcf@C3VQ3<3>PT zFP94d1;t~(@8|P(F{!vufV1d;OQ_`$gjWZQRN*d%#v65^9@M)LZT?6LN%|i$LA=ZG1%bcQ-R)2G zx%sncJ#a^CC*Ly6ShuwwEuer1;D_jFx9ZXLENf7=sfIs8-szyQWFK6Y%tOT}lP-k5 ztghA?0m-bpwY|7VhdXvPMAV$$@rPtJOw$%8OpG9>J;ivP;#~eC8|O^L1OAx<*ykQV z?HHPPNe9x+;CTCpaZGrvjuHq}WBSBwFo?o#@)EXg|JjvPbyn-b3F}y}1v1}yV&uiK;tH{Kx$g-GO`|Rs@F4@N%ERBhPY_+hrM=iDz z(ho>Nm#}kzC#!INEacV7y~saFyOQP)5amiJJ6;TKot*8{+7Y}WH7D<^Uxjz<<1N+N zI6bRM``m&1y5nnbQ;v3aYr!**kH+CKGMC=wBf8IgSG7bw7ZGT@frT?2>w^_`Y%-~E zQ?z!2uGJPkK)G_Riz?4js;Wv?5T2Ps^k1Z19C)+tD*)dLQ+aG;40*s0mpTYwZG=7x z;DA;=l|u!wakQ{slU*|4O@?sXUZAIK0VGBv<_LdiW3Om$D$L0q1i(Tav{R`%sc{Gx zhc}jS3=}l_++(}S9)QK8e)EbS6*e6g*X#W7x-x(>l)VKoR5sYrXLB=ohUFcqocPCO z>6VYTqIj57d1L#tm?qmx*6uDGAImg+r-J44cha1vN>~-wFc@+BP`#y7(8BJc>B;mc zvm-fluaSqTmg7uh|1~ULj&P>vB|u>`7orQ!p4D3(WST4Pi^l5ad-!TbrpzOhH|QuK z6WW&eZ*m;nDXJWmLoUM`o=P2#W?6jGvnJ0Z7~QlMbD&0rPbygqoD&hoT{}C#rHpKGWpZ}60fpbX42j@l! z7!U*cPrD08%=f{Tb2Ft$rS8go$E)I57Z>Rx?pvE*qpq|wO=nrui>dEAR57_r}d;8-Ic^ zmA5}W6>>v>&C>6$t6UxM@Bz$P6`*80a)Q*p;zN!1Y*rHS>x1CsjK`0B6W#Yr|LgSf z{M#^+(MCku=f=3%Ipy2S6H}(jKXOm;sMwKjq)wjy8JoT*8C9<_r`g%GzshveMay=b z6V^?vG(aqP7cIjOgG<8W&75-+=&xv(qcia6GJ~BG*|jC`_PZPJp$)W|o%(Ee%KwWc zMjKez#~6BX{8lN5Tdz#aVjK~opv^VoDF~49mC|*3Zm7J8$mkIITMkWMO$DY3ud)T; zJB~d@uOQ2^Y2HTRS5&lI=rBF->xM+?Fls6V}|m9#+QKYk}U&Zb2Lu) zW6OGVyHRXdy7~193)E6A->NJAy8Y5K+P{xQjxrYH#dAX&z}VOE{Rd&4$t=8Hf8G9v z#=1RiHi|yKEP3|~BbGNX*RPJU{dYN7@tYg?gu%7MsAY+Arb0(EWTsBlJD7f}L=QxR|mJ2D)T1B?GwpJV$`~^Bf?pr zdjA`2kZQN~Te_`W-0+(Py}`az)5*?`4wM=(7V@mk+W`kb0q0Hp9HWy2$wnBfnFas3e4yrl2cbdT@d*$9xpsj6h7M$P_xOV7u(5UM!GcT*YE zO>@2SDyO_9Ffst{I1S+I4GZ}LL+wucwLRPOF=+a-V+KtYg-h8%j2Iy{ZA-Z}Ed1s?SJUQ~#WbG_Z~> zdINy;aAe{yc1|vRtOG>CoJF~tXAm6LVV{Qv!myM}Pu(=n=u%Dr4`$b)KIu^GVP0MJ zMfev*?M6)13|mJFxEqQ}*Q2z18((D*)lA8UX=__}DRB8`eqW|p(I}9_%rXCri33`$2y#wNl7$=vU*y{ z2Mk^52W;LmpHIXN3fnK%U;fR%-;l=#Xz(I`?as7XT$8%F#V4ps1TdlyOZ|A4Fh>(| z>#jcSmVrqEWdEoTIJ62?97Ch*m4|R#ajyi5_m1lC@KLH2KGc}{t5>g|+BTD$O`op(^2(vAGh6Sj}I5>+YFGgNdWW*kdh$?l{ro_xUQWw@fx*2u*AI}~CpGgmC&h5Eyq$X?~ae3JR2Lq#9-rkgx@c5!iHYQ>Mh zDAb&oo6v4hfPS%wR}8OEqZ{2ZS|Nds~#i$jkZX-&)KV0y&-V58XROJv16=u*^|6Dv62aty{D8J zu|eqRBH40ja=?g6_`#CPOq@kgZH{7a949kJA*NStEpzdQlTIb0IKT!`4W1uZW9%OG zTgMt7D+)7qgL$B(8_D0u?cSTQs0b#+iW?FSJrZ2iG7SIr{v~JvrsSaE-C3uu39sUyZBgcf}_20+X!MPM-q!)sOnMYHbPlSM0=fG#>nCoyPjRtUBjbK`Oj#ZH^WJ)jggj6}b5?Zxzwu zk*@}WkgWbpg;ts_71W^r91M3Vq9494kiC$7#-ESR_dG6M5|te3No;3G3q?N96-PX;CSa6G^gXip}4;5cu%$s zkXW$^^0Y$*Hbr8`vq((e;`#f-^MKmM&{_rCpcW~Y zT(zczHNuIPV+6THYz1nsEl+-!)cZc50_^kmLWWDEFT}$`2kxzi&H5=VIi#92Q>>~h zq`h@b;XMu7&d}DHSq}|AhQL@uJZm=|h|$}fIu!62nVUn*$m_bmC@4yk2O{Qh-Tr)? zsKn1%Iu>0wSn`c10ijG_@q;!4vtVuw)0(=7mW&y zuMZuHnB<)EN(dx*luFLEq&mtQX(?#b1P>cs4GE%G@e#H+5~}wNfb`9VKkJBf>Tj>) z2=W-yWGc72v+|NB-;TkjN5}!=g4qrUi7XL44D<1w<7QNG=TY|L zlaR4~$Ij3pcgGBunt}z+&;G=BJ-MwH^!np7Q!66pywPl>BP?OhH0U{+bP$=hw(p0< zx$lj2mR&wGaQpX$GYwNT^?h0Q`&59huevhCd`^m^FvCAD$JMqJ#d{|%o@80i zk-+`3dpg~rwiXVPa?PYQ{0aw!CuRfB5Sp)T=|Egaff35Ykuoa=nkZe_QkY1QXm3Qy z12>7hwvGI3`-J^l=U)^pGAuMA;w(KdWrMQgAvgoZz?l zQ*F-r4_8Kg%!DYSEI5A4nH$!g1 z7yfcf&5QqBVZSoTz1NQL4-nRA}7Vs?rY3%7NClxe%s4S0Pdk#R$3c;>ICC zot6C=3dOu>gc^`tc(5o!!u;0eOU0iwjDHKzfu0mxUWs_`1p_p_zg&)=R|3!zh-^%N z+2vChkZ4mz00X^u0L$B*KL&y9qu9vJi3W1hqMy7>=}vverBAMNS!&FKNMZjnpb_Iy z_I}iZG45+wwY{$I%1+drSAOoSa2Eb!5{;~dmjKk^?#E+}(v>oENZK>!GE6DJs(5G{ za4-I<@K6Qm>*G*1HTCOf+H)0|A|IDd70b7$B}hK=)0Y;8gnFpo|F~V5O&*ux!&$eL zWb`_`m6nyMDM}K^7C#7wmvQ*zHhjbng8;!KUBvR=B!CeZ30`z0AUt8!Q{ew0=fuvJ zl<>GHwZY^Ec^4dWBnhd0V1@qb9y;z=ihFI9R+W3HBPkoQi(w0kE#c-NpGdy){3W zw;27^Nx|_>pC5#yJ2a(Z)#b!^Dt*-%Qfl6*+ee!`myK|0k)gff*7BmnNm8{N zKo=b0leHj$F(}!Yrd;?w5$a9yQO^Ug3)rce-cB($SZtb2tFp^gdj<|I%nX{n z8F?tXoN@8bYX4hdY(re&wU2@c8`fqC`q)T?Bxz}SWI&10BCd6z>V5Ko&KPCZac>E5 zo|5e2S?WU5v&9uxH&$>lpBS5y95`?V90wB+)Ov%N@1zv-ac*~PKp3twu`>6D(btVD zq(f&};j0E_0`Q$;gVcpyXB7hmMh2eu9zAkKdk!ViBu_m6IIR{wy>|Cr;M06oVGN*@ zhR`+T?2MKgLAHDN31)35=4L9+#WwZ6OYDD1?5K3ykw(f8buE;dDKPX=?Dt>C5`TS3 zTBUPy^GzG!arK$J4G9@((`^Rx)c6AZ$|RnKBs?me#kfpB9-$USi~O8MOaxkaZGQAa zq@9{FZ%W7sSgQ}+e4@%XJVGcB2cJPhsj{j2DrLxDjq@zz7_QMy=5}t<+WuE=8hH70 zBfA*5;E_93+|Tge_x>w$Y5{%xWTD{$%jI%=l{3gfoinO|)qFQBYmY6|>M2z6q4~l7 z>!2WhO3Er$OaPB(xwXYVfq%>9MD#SSK{NBC4)AQgnUZWZc+WKY_|dNl>M)j@WfqeC zhj$x`oKK%>Hk~}wqRtqte#}$?0d}U)ziwiJ|JGa`KTc;zYkVZ$)#Fw^N$>M$fK%a# zZeQLnH$LH{x1i^~<9`t8h0hMcUt}=70RL+L^Jy{tm+wALkV83&b9`TqZd&}kAAYA_ zCAP*OnV|ktL;xMN=CfywBP0Cv^9#@41m$YK(T`5rqDMME8h~?_NMF(>kmuy?S+!HV z7|hL9l*ub(tb@X!Odd(JZMxgUh!0$e1Ed^BP{WYsM_cQF~^uPC$Qz}`0e1M2> z+t=MslW#97+Ww{PoZsZVw(~i@R&XW_TwA<*YaRGmYo`5@<<81<&z|O^BF4e-^sIdG zaqb5{QOB;*dY$t zG>!64#4)U(pPXYub}s3pcawd=j~kYkkyG_0a&{NLeS6n?%M>(kS#B2&xNesIwmPmW zJcg?4*=aZ?ln{Okm@K0e0$Hu}DSc39ltL<_{beIwNa#!EUFwFSHtF~NOPXh`qbA7G zyH?4*Pd{&@Slz}_$G>gPFGlu*dGLX$X!667=ohj($JPu4uy85~WMh?XiG6-7(Y3tJe;B>*)c#upWCWas%RQt}v#sfLxc? zl&&^80zreL8F>HDbP(*P2!*nGkd-;7kBMAb#;7 zXoLeC-TnTi>uhb^^HsuwL%=IA9$tjMcOM%Ha>vm>c988B^>Fj8j?>J+h#-;?`G5qL z7u8e<+zd#^N9I2Pj4Uj~F)cJEq-UD8dfk0N2joUdL6(mqfs*|JRk?pZb)J;$$juiP z7KD-KO&Av@|Cg6m)&M&>u@Al7aM3ffZp96)#Zz09fizC(geuib8VpcS<)p}nfu9Ae zZFDtOAZw!x^3bt3ozzydesGj%BbH)l_#m&JoT3b;fJTk3V(Cf+ zwPz+uNfWIe6YU}JD)4X>Y7ELci9DOn(}YT^?SgUa@KtM4NBKfx?d@JTX(Ioy5*lP+ z;N*-H?%RwOkuqXrEgUG0YzQ(VU8n@AVo(#ZXD`X4d4WqIog=XkBj8`?p~5{gLg#ap zjNw!~gO?WqcgKW|+rlu+$uk4!2JNmfp)Uo|pxTC*-OjrZ2kh(52~**#Xp}aMYvD_*Xy3 z>*a1A1~+9p8TQ8CduT>_H*Yj-IlHW)mF`n9nP3)MGmPoK&z3)dPjNnayCaa8%nBO} zyp3bAzuYYh%I^KhVsOkxA~N|fCOx)HyI~ypt9>>ys}@i&mcx}0E2}3$8wJUDm!MDr z1Y_yotH-o0j5X|o7#w<|S;HUa8Hy`jUHkD#eqbu?wkv{o|5N7mTIz#TUZ4#>E7?mY zPvgs9RxW#_zc^=y&vj#_0RF2@9;mmP#j3o+Jc}`KcYSb^82{(`3-KH0gNeky+_86C z=2u@u|I5^XF$h7TEJa(`eHmFY>uFHTFYg&!Qe1cZZK>`t!#rgH&->rqFmNAb1Y949 znrhcd010LVt?`r)yMNb$Fc^TqQ3>vUtwt~{l2}||*#MlA)y3S!K-4G>0ET~ev3lg% zIM>0aML>u0avOaja(<^pIOpc(e;NXPqpeqkL%szJ_;K!!)a!{Q;Fj0t;sh6T$Ro6b#PjvplcnD#;(+ZqmUB2>cWAC$k_d zSuQ(YlDk+6L!wQ&$@(keD27#TQ>}Azh;@?R(I))<*qVxuHJkRc3!{dd&xJ_!V;2H} zg;%_nBSuYE`^_4U8O0g98XT6Tcbeo4e`_>OnFnW?sB&vI;k_jjE8DNla`NpwJ3D>R zurR69>-Ir!S9lnm`}Hw#0Acy_G{MO~GLm z?f;Jow)>l4xo*yEbK&Cq+j%CR7JdWZY@fJD3}!$&JI{6;ydM`-=@7Vhxhc0qeHqR1 z_LOmu7S3Oz3|82Ts`miy4pkTLOS0L@PJ2wa;*|bd+F(bk`XJ}WS*FP8+ncLyp=M1A z0=EX5&vgmX3NpTi6jE+0;Zp8v{RMJz`#(R$$uSQF28QQBbss&_?0Jg>?j7@?ua|pl zi2+%v0pqZkXJ9c_AapXerpNj)lXDx~&R_=N8P;9he<(M2RF zBcpzWBCG|S5Hb}GxE#EhB{L09Oj6|Z1s79I7$8(ldSI+X-I9%G240X3GCf6=w zW{X*h7vy*~b|J2Hop^BhdX@>!5{W1KlwwPlll2;>T9>W2eUZUa6If9ksDT?G1JWZ` zv$H3p-lHW0()5p%eJ8|fy?Ai!kF^R>Mj*`@q^+83B}kk=>%^G0B$O@6lL-q=d@94W zqRU_OcDK%%C(0Y5d?Mr?^gAXtw(0ivR@&Cazmi=HlNH)eU$~s&@)A0r*aBtQtUb#= zb_iPPYCKtfQ_}IkE*DAz7?5)@L_FAt4l$E^bsXJ*5fs4PXGVT>R4wgKfP5% z*=u3zySGydR8Is`#KX0&#WLG>+dzB@a zIEFu?FfMv5;KX>}(0)@7nQ;+z`pefRGsEmMH5toJgTc}eBZl@BB`Fr~nLf~@5HtWu zEbCf%CQ|c89H)0i+f~`jVrP+g+Y6olgj#$!hp@!LeIY}h6wi-@iq}E+zvye)Qn0iA zGZ}74nX7Rtc?%%KZmh=pP9U9NZJ)&thME(WJ5G@G;1$yF;h`&s4sg6)pQjcq1flc+ z)d{P+j>f998FW^LZFHngj5pETSJ!96+83`sPdV`(8cqA4thQcOIbUaA^qNxp1fnnv zn_d-IF<$hW4ZNxB+vNx$1*K6lui!`cAGqo2>XN!Zi0-;G?~z&}hBeYTZj_z{E)$~6 zq$+8{+|{fCEl%=}`!3afeTYE~)F(`nrNvI02V2~ES+b2C9v*TF<5B1o;X-Atv_h-z zrP#)!QR!7P8MlE}_mw|-|LHEM7fnN{hVJIU+H{s@DVvR|cCWF(bTUr#Ud{*X?Gs*% z4YlimF%tt^#0Y*ocrxrWZ-tu6kBWeJ=I~Qlej2zkLs0aJk2dUl%8^a`0@(YeYtu(2 z9k8-B52x_C#`z=STuwM;p4mGwuXl@nOn%8X+aKMlmy?PQC&v#LBs?78dDvyPG2FG* z>ybTD3v^ZfR~PzbL7g-2`w@+h{L9#Y_{4Xj&r8Fd{5pI96tBf(v;pEzgI++bheALA zm!cx@Z}YuC8(jb+eX@(eVItQGjOX_H@?`xqplr54|6G#on|#-{lt{3T0Yod2M~ zmaeb7L+>jdich#I{tXn)3oO{J*u1YrKd__vUAZ~Cg9}t3Bbs~0O4Ul#TcRZKfznsS+>jx7DPap+^!5IL&-v9+e@w0biP}-XTo~ zETa(C{;D`Rlb4j=+`7(I%E&m6AY_OVxLjl1TBnttL}^~zJ_S#vjpqDpq6Z!Ps20^< zb)Rgn)l|K%?N)UDUZ3uEgab3PsCn)Wzz`Z;bQ`a7*K!_$r4v|@H{<89ry1KJlnX**A0 zLpe5DAr*Y<@^DDU%YdBVNyn@G^y>ssi#9^|F#)KYJXrF=t&&*Q+HmZ6Yh3X3?uWImpYMO*r;8BR}y zgd8u=?KO3@4LHud`0_eJ6ScLQWPv#55zscW7>u&4h&ZhyNqpB`v&rmM;n^-Ykr?U! zzHUn9d;T_`QEzT3>kAT)!Orz@a(g;1mzBOg?3QnmIUQ5n|GlNV^REK8qH(~DYTG4U zFVR;pkvWIP&!zBEyb=nV@h4%%d6L3znho|_F^1=Jz_oy})pYV`4}pe5<>>b2TS zVPV@mEWOzlijhDvHXBJi7@|S^rPt$R_;GVdMVsGC-{WukPFO_%K^(dhaf+-G(=!Bw zj-DTuL;|JY-E;8LoIuN;w$pq8r)c2Kpz*?rbK{wqP^v_tCnvSuT_kiGbAlF2{`gY?D^QO|afAv;LC?3pY%POc}i920C8+)O%~z&yp^X3ul#l*HA*Tq{ie zU0dWNgp}I{d0K734G;P%M~Ee9`)EV_X8ZvzdsSZOc8ICj3j>V=@X<^`!LBp4=|MjD zT-#tc_dt`IpRJeZKCi^1E?bsb>)|w0j5zfB$FIjfbe8D)xI+ghw(!@V8~KlfdeoS1 z@!7xM#>=w`>Z(f?oXXk({VtK_Rvl~o*-H7j-pq~+;9-b5ywGf`=PPYHkI#MXG|$Vs zUU5E2Ou=n@8so33XFmhm{Iu)HVbJv-m@a5MwHR)!BZ=QHe#5uKgy)6E-xov82 z-a7rlzui%MRXSBex9jVn7t=PJeM0*>cpGwGX}VSr-M@cZPuH+o=N0WnC6R=Ru#S`m zYcRaF9v$HF3rwzgk{f_>J2%l=ATs3B8_}OEw1R5-&(s#FOTSM!tm6e`cec`hr6ae5 zFfV09qL?~b$enG4N$^}52U*NbOn+~DyMeqRu6&M)3K`h}hlCqA5{;h&p~g7IJmcJH ztwrr)r|hRO76G@l2$9L1I{IB$eD0@Tl}O%l&82{cX_BqbN_P``>O2Gz@sT@F^FfwJ zjGbFo9q(7XwFx(q%%_EXom^@_LZ-AB3vN2tq+)#5KmDN=_z}zBKdV}a-CVCL^TAop zb@wft`>@tjc|T9OUxsUCr$%U#!=KTll1G^aHQB38gbZrAa4JQm(1nUR^1Va*K{*Yc zI%T`n4L@X6S2WgnS-?|AkCyCA%B`w)wYg+0JjR=Ktmrjk!(MtiDQnN>G);zK$t_B- zlTAM_^mb@*`)}-Ul5(s;PLAXRd^Q5gvnZpK_rP;kV02-cRN|Ih56`)XQPCuNYGSV` zE%TVE3&oTo?LJUF{^NaLYh3`bz1>I&V^-Zn6+M-?*31)PasJezL6M7r+G$5fo#wc( zW|apNkyuD?fREiL{kvGrP4=2X4`k-Im5)7dGR!KUGV>Reb0As&fi>Aty#0)yRoPM_ z*@ja(rZYB8T0H>0KUtUSI-IGseW~(x1`mk|%{O(oT!o@n9us?N+c!<;;n(3AmzmlZ zj}pW{VRYn*&|&2CaY%niT$mtt-^YjNeD>-U7Y;U`p4kxB$<(!0cHo`U;~R5yKOp_$ z*{~1ZA(nVmFVH~P zb(*gLh6#7;BrX@M^#LhyuU9g)+OYr(Rw$XgBE2A@vw~{vjGVHLqqEQ#moX+THFt}w zyLkN)G`2TiZeE8{X5Pq@l9kRvd*XVV7jO2*nawzh@B+B-MLypCpR6L8&u&I!%mpBF zL|mQ#*cVY9It(Ez6hxJib(6{o@kp&F05BH`uY_SkQT}r?_v?4@7oDceX}yno8GIoL zFNUX--D87%q5F-hqKF^LEHfL|cnv}piNlYr)Zm&b%N z^&oxH414hdw!(SbrCl%FG>!7(aB#Ud<6?O6U6kEHc&?9-Io~0%*#{Io2w4M>Hb$J^ z#!<6ZzhsmscNoI-;*;42dm*cC4ul+}qowwqY2rP{86u$19e5CChE0A)vDW z^hEW(+l=A-lNp6#bh-W>6T?>$%ksw~b91lF_YLi7?YX+iK%VVt`h=H*nA3O`yI>IJ z`u_zb4BGQ4tm<6{4qWdR78lEoLKLPO+jH0Zv^f6eJ3c3;c+!xzS%4U24ZOGz{LO^s zA}ms51*x<^f=mwB>r#34KM3@R^AsSz^*0+o|MUNQxKMT8cw-C5NMV=NDwpQ~`5{4H zU;HvrmNp|$dQ1-N*f}m=uf`U&LuFgo*J)E_tG%?97ogN$pnAddR8|hhnmY(EMAbb* zAOPLddLhyy2&@I5eSR8_3k?;%m59x0NCGJ!7n^Z5%j~u70Cp1+?Xg1T!y8!m})@twb69*KpAwWEb!0WXY#PLub zm0M5wAWny-ZM1CVVN#nR0PO|wy9=s6o0wb?G=TEBUcEcP%TM-YqDI~YVB9ZQ@`IMe zUf0t(?aoa_uLJW#M_rGjjLiaH`3YNNbJ7%<*BcFeYf$X~B4!Lotn?Ov;5o@H`E`9F zKTtTN>J~phFjF@FG~E37F9=Ay&?+uV`#Q*b=D-@i|+Mu$HoI9@;oN?}h)WosTPJ zi2NWflY7K)iF>B|Ra9>g+Ll)=VQc=g^&ax`k&qZcOO?i+%nvhYCSMZ@wa_wnZ&}-{ zS0EH=Ey}gp6tY-?NV{&P1wb2O(pyW!rbPg-eb;JiO(bI0+v`y{B{b~20I@{@uqrmo z8cKmrh9LknDQ0K2H8hZUn*wP#A6o#24<9afYNZi$9G8z4w0S@(okhK6$4FT$PYaJ02Tqzl$f^kwKy!zr?3?uHXi7s zm>?BT=TCje6Oe|NUpbD`6_rc4R=X{M5*H_}gy2CEPFC*1)P+g#fU? z0?<4Lb=g&bvH;-kx;}F3UlUh|?{@DDYo5HT%=qRjU-^nVci}?#4%w$a{pnDkC93^W zZ|a2|0TR%ed)gi^mlMO1Nw8&J3Iaga5eoo~_0>i|ysQ~ZbjZ!I)$}^AI0=ZNIfc!- z7b)md)tK&>|NIx^g>&b_i!wlA_RX_#2D6tm7e_9Je*v;-_%yfvY@=Fw!iu-$Gb7KW zTq-@_SmoMtahNn*PpaMgd$H=^9I*AJ%8%R1b)Fp=uee`?!I2|J>V1ag?*Tyal=cU) z1yHGCM*Op@<~&kEfI@i9o1Qv{K3D*(|{KjU>iOV0IJOQ2p* zj=fiaW0j8&@iSqHU|5O26hVi@z542j;QP)N!uU4Kxf92Zm(viA(|q&D(=GhjhKR-Y z_yNcIHb3OiH~R&p=X-<@3Xn$s13(z3bPD6*Z~l`9r2Zoyl;`UZ5EAkA=sI<6_L}W= z#`lXbE-$(vKz@WkJt(so=Dknxp zh^_7XGPAiRX=PbDjezS8Wq2Qg$AUoD3Gr2z?%P`G+m2}W762wS?$(3Xmcx8082_3B z2g9s6VZJ=X=fjkSc;aw`NlQFwl!w`Ng>jTioboG=ty}5ix}~+Z6Usw?8@=|`JIK|5 z$#2tg98UtuM8-s~rWqv=IA6m0x-D;nXO~Ik3W9lY&j0R^2#ga z_#&wD7LgxtuG;w&Qt3sm&4fs4UA0X*wGdxd%F2;dl{$C1LT?j7e&(I{uqaMp_RABl z*V(*#x&~LBkDbyhoT`rra@xq)eX9ZKi^l&clm!5jfXwFOvm$^WzTWHodmem4IS%*m z{h5E=p_}sDt3ikU;UBm zb}(n~t+R1TS8d1uvH9eec7s`S7X%Hu4)T+iGUIYL1CTVc09LFv$XQJ@*V|5;PWPv* z`E!A=-g~#5pslf(-+;|A+8_fd?W?_lHt1+)p9mc1RoJ3do>YBmTQyh{pJ9L<3N*p| z53uHcy$Ct%%>Li_952gK>Wub0AkwhyAV{q4MSRySQZeVkdz-Ax8hHaW^XttKJBoa9!6zbKm%?8@ImLRJ}{`g#c z&r-)s{?)4Ua)E{bu{jGFEos3DVKc2QXSd)&;4H4vtS3%>wLBKe0}uj5s{k>nB`}2b zklw<6hXcTA?wh!cA1~vVdzWtTBkz8D@WF4s`<;2HGHlZnnH`v|@BZ`I=7(y6U_BjK zk)LZI5YTG(vj3&HI7PHnGc zfuzpUcE0QrUqA8oy5b?mVE2J_-Lvfkyc;>p5?c-LZ-h+S&fh}p)H8Vq*of7PRI5h26- z;&rZ>kOg2#pRxw3z6@0QjlUoKmLLC>;0ucXo*#cKSOFn#{uZCz2?*&$eo&sx&IvE# za?Fb@wcZBQhcG1s2(u#(pb_c#o3#_rz6=zs0Ut)_(WYAMpo~1&6kHBF{)%wm(7_Ua zmdOW2*o2cJs0b;fhz=UfD}u*}^XLO8ubw#NUO90zJd2`9J!|fZ{3$fJG#KjAhd_Y@ zK#bXmG55_Q<>5xgOiknkV&^aZ5N`RQe-vC%ypY<%Z{O4dnIOo`X2_D02M~tTwcZ7= zFQt3?%O5DmZ`L($C45IM@uCf2G7zHCx!3x2>1ILSJy4r^d~04jS^O>l zz$!>t0P7(?;2yERA5!x=FnZJ(XCMVTB#2G_b?yOJm3OJ5yTbgp;RvO&1rYzCM=daH zkjb%`p9HH0wBcr;o_5q@0W<@by9IE$KqQZs`y>d~VFiS@0MY9F6<9qSHWonkO5jG3 zwwYLO8#f!Z1VA2a3U&m*rH_pi0J*;gIQRbphp@;frMy7;00000NkvXXu0mjfzWV}L literal 18254 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 KMNUMnLSTZkam`Ku From da2abe281dc303d4ddf8e76654e6262077429f5c Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Sun, 13 Jul 2025 14:57:43 -0500 Subject: [PATCH 33/45] add paintable network cable --- src/main/java/com/hbm/blocks/ModBlocks.java | 11 + .../BlockOpenComputersCablePaintable.java | 244 ++++++++++++++++++ .../java/com/hbm/main/CraftingManager.java | 7 +- .../java/com/hbm/tileentity/TileMappings.java | 9 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/blocks/oc_cable_base.png | Bin 0 -> 624 bytes .../hbm/textures/blocks/oc_cable_overlay.png | Bin 0 -> 340 bytes 7 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_overlay.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5f3de7f83..01b28241f 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -34,6 +34,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import cpw.mods.fml.common.Loader; import java.util.ArrayList; @@ -803,6 +804,7 @@ public class ModBlocks { public static Block radio_torch_reader; public static Block radio_torch_controller; public static Block radio_telex; + public static Block oc_cable_paintable; public static Block conveyor; public static Block conveyor_express; @@ -2340,6 +2342,10 @@ public class ModBlocks { absorber_pink = new BlockAbsorber(Material.iron, 10000F).setBlockName("absorber_pink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_pink"); decon = new BlockDecon(Material.iron).setBlockName("decon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":decon_side"); + if (Loader.isModLoaded("OpenComputers")) { + oc_cable_paintable = new BlockOpenComputersCablePaintable().setBlockName("oc_cable_paintable").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); + } + volcano_core = new BlockVolcano().setBlockName("volcano_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_core"); volcano_rad_core = new BlockVolcano().setBlockName("volcano_rad_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_rad_core"); @@ -3532,6 +3538,11 @@ public class ModBlocks { GameRegistry.registerBlock(gas_explosive, gas_explosive.getUnlocalizedName()); GameRegistry.registerBlock(vacuum, vacuum.getUnlocalizedName()); + // OC Compat Items + if (Loader.isModLoaded("OpenComputers")) { + register(oc_cable_paintable); + } + //??? GameRegistry.registerBlock(crystal_virus, crystal_virus.getUnlocalizedName()); GameRegistry.registerBlock(crystal_hardened, crystal_hardened.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java new file mode 100644 index 000000000..b755006d5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -0,0 +1,244 @@ +package com.hbm.blocks.network; + +import api.hbm.block.IToolable; +import com.hbm.blocks.IBlockMultiPass; +import com.hbm.lib.RefStrings; +import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.tileentity.TileEntityLoadedBase; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import li.cil.oc.api.network.Environment; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +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.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import li.cil.oc.api.network.Message; +import li.cil.oc.api.network.Node; +import li.cil.oc.api.Network; +import li.cil.oc.api.network.Visibility; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.Loader; + +public class BlockOpenComputersCablePaintable extends BlockContainer implements IToolable, IBlockMultiPass { + + @SideOnly(Side.CLIENT) protected IIcon overlay; + + public BlockOpenComputersCablePaintable() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityOpenComputersCablePaintable(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg.registerIcon(RefStrings.MODID + ":oc_cable_base"); + this.overlay = reg.registerIcon(RefStrings.MODID + ":oc_cable_overlay"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + if(RenderBlockMultipass.currentPass == 1) { + return this.overlay; + } else { + return pipe.block.getIcon(side, pipe.meta); + } + } + } + + return RenderBlockMultipass.currentPass == 1 ? this.overlay : this.blockIcon; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float fX, float fY, float fZ) { + + ItemStack stack = player.getHeldItem(); + + if(stack != null && stack.getItem() instanceof ItemBlock) { + ItemBlock ib = (ItemBlock) stack.getItem(); + Block block = ib.field_150939_a; + + if(block.renderAsNormalBlock() && block != this) { + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block == null) { + pipe.block = block; + pipe.meta = stack.getItemDamage() & 15; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + } + } + + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if(tool != ToolType.SCREWDRIVER) return false; + + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof TileEntityOpenComputersCablePaintable) { + TileEntityOpenComputersCablePaintable pipe = (TileEntityOpenComputersCablePaintable) tile; + + if(pipe.block != null) { + pipe.block = null; + world.markBlockForUpdate(x, y, z); + pipe.markDirty(); + return true; + } + } + + return false; + } + + @Override + public int getPasses() { + return 2; + } + + @Override + public int getRenderType(){ + return IBlockMultiPass.getRenderType(); + } + + // WHY the fuck is this not compiling + @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers")}) + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment { + + protected Node node; + protected boolean addedToNetwork = false; + + private Block block; + private int meta; + private Block lastBlock; + private int lastMeta; + + public TileEntityOpenComputersCablePaintable() { + node = Network.newNode(this, Visibility.None).create(); + } + + @Override + public void updateEntity() { + super.updateEntity(); + + if(worldObj.isRemote && (lastBlock != block || lastMeta != meta)) { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + lastBlock = block; + lastMeta = meta; + } + + if(!this.getWorldObj().isRemote && !addedToNetwork) { + addedToNetwork = true; + Network.joinOrCreateNetwork(this); + } + + } + + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int id = nbt.getInteger("block"); + this.block = id == 0 ? null : Block.getBlockById(id); + this.meta = nbt.getInteger("meta"); + + if (node != null && node.host() == this) { + node.load(nbt.getCompoundTag("oc:node")); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); + nbt.setInteger("meta", meta); + + if (node != null && node.host() == this) { + final NBTTagCompound nodeNbt = new NBTTagCompound(); + node.save(nodeNbt); + nbt.setTag("oc:node", nodeNbt); + } + } + + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } + + // OC Cable Things + @Override + public Node node() { + return node; + } + + @Override + public void onConnect(Node node) {} + + @Override + public void onDisconnect(Node node) {} + + @Override + public void onMessage(Message message) {} + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + if (node != null) node.remove(); + } + + public void invalidate() { + super.invalidate(); + if (node != null) node.remove(); + } + } +} diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 67b872581..3892e6a3a 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -237,6 +237,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 1), new Object[] { "BBB", "WFW", "RRR", 'B', BE.ingot(), 'R', ModItems.coil_tungsten, 'W', CU.plateCast(), 'F', Item.getItemFromBlock(Blocks.furnace) }); addRecipeAuto(new ItemStack(ModBlocks.red_wire_coated, 16), new Object[] { "WRW", "RIR", "WRW", 'W', ModItems.plate_polymer, 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.red_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); + addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.cable_switch, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_detector, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_diode, 1), new Object[] { " Q ", "CAC", " Q ", 'Q', SI.nugget(), 'C', ModBlocks.red_cable, 'A', AL.ingot() }); @@ -410,7 +411,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.basalt_polished, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_smooth }); addRecipeAuto(new ItemStack(ModBlocks.basalt_brick, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_polished }); addRecipeAuto(new ItemStack(ModBlocks.basalt_tiles, 4), new Object[] { "CC", "CC", 'C', ModBlocks.basalt_brick }); - + addShapelessAuto(new ItemStack(ModBlocks.lightstone, 4), new Object[] { Blocks.stone, Blocks.stone, Blocks.stone, ModItems.powder_limestone }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.TILE.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, 0) }); addRecipeAuto(new ItemStack(ModBlocks.lightstone, 4, LightstoneType.BRICKS.ordinal()), new Object[] { "CC", "CC", 'C', new ItemStack(ModBlocks.lightstone, 1, LightstoneType.TILE.ordinal()) }); @@ -442,7 +443,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_ultradeath, 4), new Object[] { "BCB", "CIC", "BCB", 'B', ModBlocks.barbed_wire, 'C', ModItems.powder_yellowcake, 'I', ModItems.nuclear_waste }); addShapelessAuto(new ItemStack(ModBlocks.sandbags, 4), new Object[] { ModItems.plate_polymer, KEY_SAND, KEY_SAND, KEY_SAND }); - + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.tape_recorder), 4), new Object[] { "TST", "SSS", 'T', W.ingot(), 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_poles), 16), new Object[] { "S S", "SSS", "S S", 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.pole_top), 1), new Object[] { "T T", "TRT", "BBB", 'T', W.ingot(), 'B', BE.ingot(), 'R', MINGRADE.ingot() }); @@ -610,7 +611,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.fluid_pump, 1), new Object[] { " S ", "PGP", "IMI", 'S', STEEL.shell(), 'P', STEEL.pipe(), 'G', GRAPHITE.ingot(), 'I', STEEL.ingot(), 'M', ModItems.motor }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 8), new Object[] { "CRC", 'C', CU.plateCast(), 'R', ANY_RUBBER.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.pneumatic_tube, 24), new Object[] { "CRC", 'C', CU.plateWelded(), 'R', ANY_RUBBER.ingot() }); - + addRecipeAuto(new ItemStack(ModItems.template_folder, 1), new Object[] { "LPL", "BPB", "LPL", 'P', Items.paper, 'L', "dye", 'B', "dye" }); addRecipeAuto(new ItemStack(ModItems.pellet_antimatter, 1), new Object[] { "###", "###", "###", '#', ModItems.cell_antimatter }); addRecipeAuto(new ItemStack(ModItems.fluid_tank_empty, 8), new Object[] { "121", "1G1", "121", '1', AL.plate(), '2', IRON.plate(), 'G', KEY_ANYPANE }); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 1c938ab18..438b6c605 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -40,6 +40,7 @@ import com.hbm.blocks.network.FluidDuctPaintable.TileEntityPipePaintable; import com.hbm.blocks.network.FluidDuctPaintableBlockExhaust.TileEntityPipeExhaustPaintable; import com.hbm.blocks.network.FluidPump.TileEntityFluidPump; import com.hbm.blocks.rail.RailStandardSwitch.TileEntityRailSwitch; +import com.hbm.blocks.network.BlockOpenComputersCablePaintable.TileEntityOpenComputersCablePaintable; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.deco.*; import com.hbm.tileentity.machine.*; @@ -50,6 +51,7 @@ import com.hbm.tileentity.machine.rbmk.*; import com.hbm.tileentity.machine.storage.*; import com.hbm.tileentity.network.*; import com.hbm.tileentity.turret.*; +import cpw.mods.fml.common.Loader; import net.minecraft.tileentity.TileEntity; @@ -451,6 +453,13 @@ public class TileMappings { put(TileEntityDroneRequester.class, "tileentity_drone_requester"); put(TileEntityRailSwitch.class, "tileentity_rail_switch"); + + // OC Compat items + boolean ocPresent = Loader.isModLoaded("OpenComputers"); + + if (ocPresent) { + put(TileEntityOpenComputersCablePaintable.class, "tileentity_oc_cable_paintable"); + } } private static void put(Class clazz, String... names) { diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..c7ab3f6fe 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -6227,3 +6227,5 @@ desc.gui.upgrade.effectiveness= * §aEffectiveness§r: Stacks to level 3 desc.gui.upgrade.overdrive= * §7Overdrive§r: Stacks to level 3 desc.gui.upgrade.power= * §1Power-Saving§r: Stacks to level 3 desc.gui.upgrade.speed= * §4Speed§r: Stacks to level 3 + +tile.oc_cable_paintable.name=Paintable Network Cable diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png new file mode 100644 index 0000000000000000000000000000000000000000..243c2da7f8f52b96ec7dba690200d6902ca3ea4d GIT binary patch literal 624 zcmV-$0+0QPP)nh*GJ9h6YW3HdHDVeE9eYiM2I|nFmv}&*K3B__eWtZ{L5& z9ihduSAnH<9qXH0XxigO#UPZ+WgKX2mEZ=(C+?QMBx2ZTUApGP*Eg%})ovtS9(mcD=%kJ~)klnBb)8}p|4|)RuMCV>&E0wANxOd|#TAUijrUFWy z8LXcfunZ9n4NzZC5HquLH301L0&>P3|zt8 z$@}U>a*|oVD+hy`dvoO(PS6G7^>bP0l+XkK De2Z3~ literal 0 HcmV?d00001 From 119b8a037b222fe8aa6d8fa54c75b22bf0826d01 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:30:34 +0200 Subject: [PATCH 34/45] Revert "the spinniest of the fidgets" This reverts commit 2841c8b67b8f459573142bbf33b1727f57159495. --- .../inventory/gui/GUIMachineTurbineGas.java | 15 ++++++--------- .../machine/TileEntityMachineTurbineGas.java | 13 +++---------- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 36270 -> 18254 bytes 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 21945ed89..eee3c7fad 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -115,18 +115,15 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.state == 1) { - double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); - } - else { - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); - } + if(turbinegas.powerSliderPos == 0) + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); + else + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index a198b14c5..0e5d6b9a1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -107,17 +107,10 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement } <<<<<<< HEAD - if(autoMode) { //power production depending on power requirement and fuel level + if(autoMode) { //power production depending on power requirement - int powerSliderTarget; - - //when low on fuel, decrease consumption linearly - if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { - powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge - } - else { - powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); - } + //scales the slider proportionally to the power gauge + int powerSliderTarget = 60 - (int) (60 * power / maxPower); ======= diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index ed0747f04..cb32c226e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1033,7 +1033,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank +desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 4e33cca35052cf5e838ca844047ae0e55adf1c76..290e3810bc5904d60a3feda9ccae75c7318be4d0 100644 GIT binary patch literal 18254 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 KMNUMnLSTZkam`Ku literal 36270 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 From fa6497146ac55e88e4d18aa6b2dcdf058bcb4fd7 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:43:02 +0200 Subject: [PATCH 35/45] hopefully i didn't fuck up CCGT changes, automode now lowers throttle when fuel low, displays fuel consumption instead of a generic power setting in the GUI, small change in GUI description, the texture now includes what should be an air filter at the tubine intake. i am NOT good at texturing. --- .../inventory/gui/GUIMachineTurbineGas.java | 18 ++++++++------ .../machine/TileEntityMachineTurbineGas.java | 22 ++++++++---------- src/main/resources/assets/hbm/lang/en_US.lang | 2 +- .../textures/models/machines/turbinegas.png | Bin 18254 -> 36270 bytes 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index eee3c7fad..241b1e6eb 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -109,21 +109,24 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } @Override - public void drawScreen(int mouseX, int mouseY, float f) { +public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 108, 142, 16, turbinegas.power, turbinegas.getMaxPower()); - if(turbinegas.powerSliderPos == 0) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Turbine idle"}); - else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {(turbinegas.powerSliderPos) * 100 / 60 + "% power"}); + if(turbinegas.state == 1) { + double consumption = turbinegas.fuelMaxCons.containsKey(turbinegas.tanks[0].getTankType()) ? turbinegas.fuelMaxCons.get(turbinegas.tanks[0].getTankType()) : 5D; + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Fuel consumption: " + 20 * (consumption * 0.05D + consumption * turbinegas.throttle / 100) + " mb/s"}); + } + else { + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 36, guiTop + 36, 16, 66, mouseX, mouseY, new String[] {"Generator offline"}); + } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); @@ -146,6 +149,7 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { if(turbinegas.tanks[0].getFill() < 5000 || turbinegas.tanks[1].getFill() < 1000) this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 34 + 32, 16, 16, guiLeft - 8, guiTop + 44 + 16, warning); } + @Override protected void drawGuiContainerBackgroundLayer(float iinterpolation, int x, int y) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 0e5d6b9a1..b0705734c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -105,21 +105,19 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement tanks[0].setTankType(fluid); } } -<<<<<<< HEAD - if(autoMode) { //power production depending on power requirement + if(autoMode) { //power production depending on power requirement and fuel level - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); + int powerSliderTarget; + + //when low on fuel, decrease consumption linearly + if(tanks[0].getFill() * 10 > tanks[0].getMaxFill()) { + powerSliderTarget = 60 - (int) (60 * power / maxPower); //scales the slider proportionally to the power gauge + } + else { + powerSliderTarget = (int) ( tanks[0].getFill() * 0.0001 * (60 - (int) (60 * power / maxPower)) ); + } -======= - - if(autoMode) { //power production depending on power requirement - - //scales the slider proportionally to the power gauge - int powerSliderTarget = 60 - (int) (60 * power / maxPower); - ->>>>>>> origin/master if(powerSliderTarget > powerSliderPos) { //makes the auto slider slide instead of snapping into position powerSliderPos++; } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..ed0747f04 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1033,7 +1033,7 @@ desc.gui.rtg.pellets=Accepted Pellets: desc.gui.rtg.pelletHeat=%s (%s heat) desc.gui.rtg.pelletPower=%s (%s HE/tick) desc.gui.template=§9Templates§r$Templates can be made by$using the Machine Template Folder. -desc.gui.turbinegas.automode=§2Automatic Turbine Throttling Mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the power production$based on the power required from the network +desc.gui.turbinegas.automode=§2Automatic turbine throttling mode§r$By clicking the "AUTO" button, the turbine$will automatically adjust the throttle position$based on the power required from the network$and the fuel level in the internal tank desc.gui.turbinegas.fuels=§6Accepted fuels:§r desc.gui.turbinegas.warning=§cFuel or lubricant level low!§r desc.gui.zirnox.coolant=§3Coolant§r$CO2 transfers heat from the core to the water.$This will boil it into super dense steam.$The efficiency of cooling and steam production$is based on pressure. diff --git a/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png b/src/main/resources/assets/hbm/textures/models/machines/turbinegas.png index 290e3810bc5904d60a3feda9ccae75c7318be4d0..4e33cca35052cf5e838ca844047ae0e55adf1c76 100644 GIT binary patch literal 36270 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 literal 18254 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 KMNUMnLSTZkam`Ku From dc042267139c33f6fbf4066637831838dd148115 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:45:05 +0200 Subject: [PATCH 36/45] fuck --- .../java/com/hbm/inventory/gui/GUIMachineTurbineGas.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 241b1e6eb..924a893c5 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -109,7 +109,7 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } @Override -public void drawScreen(int mouseX, int mouseY, float f) { + public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); @@ -124,9 +124,9 @@ public void drawScreen(int mouseX, int mouseY, float f) { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "�C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20�C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); From 982e50556bd1e078bf40183fb93250109c3ae0e4 Mon Sep 17 00:00:00 2001 From: Pvndols Date: Sun, 13 Jul 2025 22:47:48 +0200 Subject: [PATCH 37/45] mauricio i can't move it move it anymore AAAAAAAAAAAAAAAAAAAAA --- src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 924a893c5..87895df93 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -124,9 +124,9 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "�C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20�C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); From c83a53b62a90f13695f1690ff6bddeef9991502c Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 13 Jul 2025 23:27:29 +0200 Subject: [PATCH 38/45] ass embluh --- .../recipes/AssemblyMachineRecipes.java | 158 +- .../recipes/loader/GenericRecipes.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 1 - .../TileEntityMachineAssemblyMachine.java | 16 +- .../hbm/models/machines/assembly_machine.obj | 4082 +++++++++-------- src/main/resources/assets/hbm/sounds.json | 3 + .../hbm/sounds/block/assemblerStart.ogg | Bin 0 -> 5915 bytes .../assets/hbm/sounds/block/assemblerStop.ogg | Bin 0 -> 6581 bytes .../hbm/sounds/block/assemblerStrike1.ogg | Bin 0 -> 7855 bytes .../hbm/sounds/block/assemblerStrike2.ogg | Bin 0 -> 8532 bytes .../models/machines/assembly_machine.png | Bin 2748 -> 2825 bytes 11 files changed, 2225 insertions(+), 2037 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index fa7202ec5..629e10584 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -17,8 +17,10 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; +import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -98,12 +100,14 @@ public class AssemblyMachineRecipes extends GenericRecipes { // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.chemplant").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_plant, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(CU.pipe(), 2), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.coil_tungsten, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.centrifuge").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_centrifuge, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); - this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) - .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) @@ -116,7 +120,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) + .inputItems(new ComparableStack(ModItems.tank_steel, 3), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3), new OreDictStack(DURA.plate(), 4))); + this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); + // generators + this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) + .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); @@ -126,6 +144,37 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); + + // fluid tanks + this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4))); + this.register(new GenericRecipe("ass.bat9k").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_bat9000, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(ANY_TAR.any(), 16))); + this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1))); + + // fusion reactor + this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) + .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); + this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) + .inputItems(new OreDictStack(ANY_HARDPLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 6), new OreDictStack(ALLOY.wireFine(), 24))); + this.register(new GenericRecipe("ass.fusionmotor").setup(400, 100).outputItems(new ItemStack(ModBlocks.fusion_motor, 1)) + .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4))); + this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) + .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); + + // watz + this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(ZR.ingot(), 2), new OreDictStack(BIGMT.ingot(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.watzcooler").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_cooler, 3)) + .inputItems(new OreDictStack(STEEL.plateCast(), 2), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 2))); + this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ // rancid shit mob spawners this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) @@ -137,6 +186,111 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.buckshot").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_buckshot, 1)) .inputItems(new OreDictStack(PB.nugget(), 6))); + // bombs + this.register(new GenericRecipe("ass.minenaval").setup(300, 100).outputItems(new ItemStack(ModBlocks.mine_naval, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 24))); + this.register(new GenericRecipe("ass.gadget").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_gadget, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new ComparableStack(ModItems.fins_flat, 2), new ComparableStack(ModItems.pedestal_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.littleboy").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_boy, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_BLUE, 4))); + this.register(new GenericRecipe("ass.fatman").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_man, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_YELLOW, 6))); + this.register(new GenericRecipe("ass.ivymike").setup(600, 100).outputItems(new ItemStack(ModBlocks.nuke_mike, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(AL.shell(), 4), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_LIGHTGRAY, 16))); + this.register(new GenericRecipe("ass.tsarbomba").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.nuke_tsar, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_tri_steel, 1), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_BLACK, 8))); + this.register(new GenericRecipe("ass.ninadidnothingwrong").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_prototype, 1)) + .inputItems(new ComparableStack(ModItems.dysfunctional_reactor, 1), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.ingot_euphemium, 3), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.fleija").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_fleija, 1)) + .inputItems(new OreDictStack(AL.shell(), 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_WHITE, 4))); + this.register(new GenericRecipe("ass.solinium").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_solinium, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.n2mine").setup(200, 100).outputItems(new ItemStack(ModBlocks.nuke_n2, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(MAGTUNG.wireFine(), 12), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.CONTROLLER), new OreDictStack(KEY_GREEN, 8))); + this.register(new GenericRecipe("ass.balefirebomb").setup(400, 100).outputItems(new ItemStack(ModBlocks.nuke_fstbmb, 1)) + .inputItems(new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(TI.shell(), 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 8))); + this.register(new GenericRecipe("ass.customnuke").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_custom, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 4))); + this.register(new GenericRecipe("ass.levibomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.float_bomb, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); + this.register(new GenericRecipe("ass.endobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_endo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + this.register(new GenericRecipe("ass.exobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_exo, 1)) + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(P_RED.dust(), 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // bomb parts + this.register(new GenericRecipe("ass.explosivelenses1").setup(400, 100).outputItems(new ItemStack(ModItems.early_explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(GOLD.wireFine(), 16), new ComparableStack(ModBlocks.det_cord, 8), new OreDictStack(CU.plate(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 20), new OreDictStack(ANY_PLASTIC.ingot(), 4))); + this.register(new GenericRecipe("ass.explosivelenses2").setup(400, 100).outputItems(new ItemStack(ModItems.explosive_lenses, 1)) + .inputItems(new OreDictStack(AL.plate(), 8), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 4), new OreDictStack(CU.plate(), 2), new ComparableStack(ModItems.ball_tatb, 16), new OreDictStack(RUBBER.ingot(), 2))); + this.register(new GenericRecipe("ass.wiring").setup(200, 100).outputItems(new ItemStack(ModItems.gadget_wireing, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(GOLD.wireFine(), 12))); + this.register(new GenericRecipe("ass.core1").setup(1_200, 100).outputItems(new ItemStack(ModItems.gadget_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 7), new OreDictStack(U238.nugget(), 3))); + this.register(new GenericRecipe("ass.boyshield").setup(200, 100).outputItems(new ItemStack(ModItems.boy_shielding, 1)) + .inputItems(new OreDictStack(OreDictManager.getReflector(), 12), new OreDictStack(STEEL.plate528(), 4))); + this.register(new GenericRecipe("ass.boytarget").setup(200, 100).outputItems(new ItemStack(ModItems.boy_target, 1)) + .inputItems(new OreDictStack(U235.nugget(), 18))); + this.register(new GenericRecipe("ass.boybullet").setup(200, 100).outputItems(new ItemStack(ModItems.boy_bullet, 1)) + .inputItems(new OreDictStack(U235.nugget(), 9))); + this.register(new GenericRecipe("ass.boypropellant").setup(200, 100).outputItems(new ItemStack(ModItems.boy_propellant, 1)) + .inputItems(new ComparableStack(ModItems.cordite, 8), new OreDictStack(IRON.plate528(), 8), new OreDictStack(AL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 4))); + this.register(new GenericRecipe("ass.boyigniter").setup(200, 100).outputItems(new ItemStack(ModItems.boy_igniter, 1)) + .inputItems(new OreDictStack(AL.shell(), 3), new OreDictStack(DURA.plateCast(), 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 16))); + this.register(new GenericRecipe("ass.manigniter").setup(200, 100).outputItems(new ItemStack(ModItems.man_igniter, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 6), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(MINGRADE.wireFine(), 9))); + this.register(new GenericRecipe("ass.mancore").setup(1_200, 100).outputItems(new ItemStack(ModItems.man_core, 1)) + .inputItems(new OreDictStack(PU239.nugget(), 8), new OreDictStack(BE.nugget(), 2))); + this.register(new GenericRecipe("ass.mikecore").setup(1_200, 100).outputItems(new ItemStack(ModItems.mike_core, 1)) + .inputItems(new OreDictStack(U238.nugget(), 24), new OreDictStack(PB.ingot(), 6))); + this.register(new GenericRecipe("ass.mikedeut").setup(600, 100).outputItems(new ItemStack(ModItems.mike_deut, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.cell_deuterium, 10))); + this.register(new GenericRecipe("ass.mikecooler").setup(300, 100).outputItems(new ItemStack(ModItems.mike_cooling_unit, 1)) + .inputItems(new OreDictStack(IRON.plate528(), 8), new ComparableStack(ModItems.coil_copper, 5), new ComparableStack(ModItems.coil_tungsten, 5), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.fleijaigniter").setup(200, 100).outputItems(new ItemStack(ModItems.fleija_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 6), new OreDictStack(SA326.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.fleijacore").setup(600, 100).outputItems(new ItemStack(ModItems.fleija_core, 1)) + .inputItems(new OreDictStack(U235.nugget(), 8), new OreDictStack(NP237.nugget(), 2), new OreDictStack(BE.nugget(), 4), new ComparableStack(ModItems.coil_copper, 2))); + this.register(new GenericRecipe("ass.fleijacharge").setup(300, 100).outputItems(new ItemStack(ModItems.fleija_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(SA326.plate(), 8))); + this.register(new GenericRecipe("ass.soliniumigniter").setup(200, 100).outputItems(new ItemStack(ModItems.solinium_igniter, 1)) + .inputItems(new OreDictStack(TI.plate528(), 4), new OreDictStack(ALLOY.wireFine(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()), new ComparableStack(ModItems.coil_gold, 1))); + this.register(new GenericRecipe("ass.soliniumcore").setup(600, 100).outputItems(new ItemStack(ModItems.solinium_core, 1)) + .inputItems(new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1))); + this.register(new GenericRecipe("ass.soliniumcharge").setup(300, 100).outputItems(new ItemStack(ModItems.solinium_propellant, 1)) + .inputItems(new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4))); + + // grenades + this.register(new GenericRecipe("ass.incgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_fire, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new OreDictStack(P_RED.dust(), 1), new OreDictStack(CU.plate(), 2))); + this.register(new GenericRecipe("ass.shrapgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_shrapnel, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_buckshot, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.clustergrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_cluster, 1)) + .inputItems(new ComparableStack(ModItems.grenade_frag, 1), new ComparableStack(ModItems.pellet_cluster, 1), new OreDictStack(STEEL.plate(), 2))); + this.register(new GenericRecipe("ass.signalflare").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_flare, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(Items.glowstone_dust, 1), new OreDictStack(AL.plate(), 2))); + this.register(new GenericRecipe("ass.electricgrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_electric, 1)) + .inputItems(new ComparableStack(ModItems.grenade_generic, 1), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CAPACITOR.ordinal()), new OreDictStack(GOLD.plate(), 2))); + this.register(new GenericRecipe("ass.pulsegrenade").setup(100, 100).outputItems(new ItemStack(ModItems.grenade_pulse, 4)) + .inputItems(new OreDictStack(STEEL.plate(), 1), new OreDictStack(IRON.plate(), 3), new OreDictStack(MINGRADE.wireFine(), 6), new ComparableStack(Items.diamond, 1))); + this.register(new GenericRecipe("ass.plasmagrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_plasma, 2)) + .inputItems(new OreDictStack(STEEL.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.cell_deuterium, 1), new ComparableStack(ModItems.cell_tritium, 1))); + this.register(new GenericRecipe("ass.taugrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_tau, 2)) + .inputItems(new OreDictStack(PB.plate(), 3), new OreDictStack(ALLOY.plate(), 1), new ComparableStack(ModItems.coil_advanced_torus, 1), new ComparableStack(ModItems.ammo_standard, 1, EnumAmmo.TAU_URANIUM))); + this.register(new GenericRecipe("ass.schrabgrenade").setup(200, 100).outputItems(new ItemStack(ModItems.grenade_schrabidium, 1)) + .inputItems(new ComparableStack(ModItems.grenade_flare, 1), new OreDictStack(SA326.dust(), 1), new OreDictStack(OreDictManager.getReflector(), 2))); + this.register(new GenericRecipe("ass.nukagrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_nuclear, 1)) + .inputItems(new OreDictStack(IRON.plate(), 1), new OreDictStack(STEEL.plate(), 1), new OreDictStack(PU239.nugget(), 2), new OreDictStack(MINGRADE.wireFine(), 2))); + this.register(new GenericRecipe("ass.zomggrenade").setup(600, 100).outputItems(new ItemStack(ModItems.grenade_zomg, 1)) + .inputItems(new ComparableStack(ModItems.plate_paa, 3), new OreDictStack(OreDictManager.getReflector(), 1), new ComparableStack(ModItems.coil_magnetized_tungsten, 3), new ComparableStack(ModItems.powder_power, 3))); + this.register(new GenericRecipe("ass.bholegrenade").setup(1_200, 100).outputItems(new ItemStack(ModItems.grenade_black_hole, 1)) + .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 6), new OreDictStack(OreDictManager.getReflector(), 3), new ComparableStack(ModItems.coil_magnetized_tungsten, 2), new ComparableStack(ModItems.black_hole, 1))); + // missile parts this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 6cb020bd6..4738b449a 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -55,7 +55,7 @@ public abstract class GenericRecipes extends Serializab public void register(T recipe) { this.recipeOrderedList.add(recipe); - if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been reciped with a duplicate ID!"); + if(recipeNameMap.containsKey(recipe.name)) throw new IllegalStateException("Recipe " + recipe.name + " has been registered with a duplicate ID!"); this.recipeNameMap.put(recipe.name, recipe); } diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 67b872581..3b85c6c60 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -258,7 +258,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.capacitor_niobium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', RUBBER.ingot(), 'C', NB.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_tantalium, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', TA.block(), 'W', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_schrabidate, 1), new Object[] { "PPP", "ICI", "WWW", 'P', STEEL.plate(), 'I', ANY_RESISTANTALLOY.ingot(), 'C', SBD.block(), 'W', STEEL.ingot() }); - //addRecipeAuto(new ItemStack(ModBlocks.machine_coal_off, 1), new Object[] { "STS", "SCS", "SFS", 'S', STEEL.ingot(), 'T', ModItems.tank_steel, 'C', MINGRADE.ingot(), 'F', Blocks.furnace }); addRecipeAuto(new ItemStack(ModBlocks.machine_wood_burner, 1), new Object[] { "PPP", "CFC", "I I" , 'P', STEEL.plate528(), 'C', ModItems.coil_copper, 'I', IRON.ingot(), 'F', Blocks.furnace}); addRecipeAuto(new ItemStack(ModBlocks.machine_turbine, 1), new Object[] { "SMS", "PTP", "SMS", 'S', STEEL.ingot(), 'T', ModItems.turbine_titanium, 'M', ModItems.coil_copper, 'P', ANY_PLASTIC.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.machine_converter_he_rf, 1), new Object[] { "RRR", "WWW", "III", 'R', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CAPACITOR), 'W', REDSTONE.dust(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 7007e54e5..508259c48 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -129,7 +129,8 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl audio = rebootAudio(audio); } audio.keepAlive(); - audio.updateVolume(this.getVolume(1F)); + audio.updatePitch(0.75F); + audio.updateVolume(this.getVolume(0.5F)); } else { if(audio != null) { @@ -145,6 +146,10 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl } else{ arm.returnToNullPos(); } + + if(!this.muffled && arm.prevAngles[3] != arm.angles[3] && arm.angles[3] == -0.75) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStrike", this.getVolume(0.5F), 1F); + } } this.prevRing = this.ring; @@ -167,12 +172,14 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl this.prevRing += 360D; } this.ringDelay = 20 + worldObj.rand.nextInt(21); + //MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); } } else { if(this.ringDelay > 0) this.ringDelay--; if(this.ringDelay <= 0) { this.ringTarget += (worldObj.rand.nextDouble() * 2 - 1) * 135; this.ringSpeed = 10D + worldObj.rand.nextDouble() * 5D; + if(!this.muffled) MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStart", this.getVolume(0.25F), 1.25F + worldObj.rand.nextFloat() * 0.25F); } } } @@ -180,7 +187,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl } @Override public AudioWrapper createAudioLoop() { - return MainRegistry.proxy.getLoopedSound("hbm:block.chemicalPlant", xCoord, yCoord, zCoord, 1F, 15F, 1.0F, 20); + return MainRegistry.proxy.getLoopedSound("hbm:block.motor", xCoord, yCoord, zCoord, 0.5F, 15F, 0.75F, 20); } @Override public void onChunkUnload() { @@ -223,12 +230,17 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); + boolean wasProcessing = this.didProcess; this.inputTank.deserialize(buf); this.outputTank.deserialize(buf); this.power = buf.readLong(); this.maxPower = buf.readLong(); this.didProcess = buf.readBoolean(); this.assemblerModule.deserialize(buf); + + if(wasProcessing && !didProcess) { + MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.assemblerStop", this.getVolume(0.25F), 1.5F); + } } @Override diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj index 52d865f16..bf0e3b1c4 100644 --- a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -1,5 +1,302 @@ # Blender v2.79 (sub 0) OBJ File: 'assembler.blend' # www.blender.org +o Head2 +v -0.125000 2.750000 0.000000 +v 0.125000 2.750000 -0.000000 +v -0.125000 2.750000 -0.250000 +v 0.125000 2.750000 -0.250000 +v -0.125000 1.750000 -0.250000 +v -0.125000 1.750000 0.000000 +v 0.125000 1.750000 -0.000000 +v 0.125000 1.750000 -0.250000 +v -0.062500 2.500000 -0.250000 +v 0.062500 2.500000 -0.250000 +v -0.062500 2.500000 -0.437500 +v 0.062500 2.500000 -0.437500 +v -0.062500 2.250000 -0.437500 +v 0.062500 2.250000 -0.437500 +v -0.062500 2.250000 -0.250000 +v 0.062500 2.250000 -0.250000 +v 0.250000 2.625000 -0.093750 +v 0.250000 1.875000 -0.093750 +v 0.250000 2.625000 -0.156250 +v 0.250000 1.875000 -0.156250 +v 0.125000 2.625000 -0.093750 +v 0.125000 1.875000 -0.093750 +v 0.125000 2.625000 -0.156250 +v 0.125000 1.875000 -0.156250 +v 0.187500 2.562500 -0.093750 +v 0.187500 1.937500 -0.093750 +v 0.187500 2.562500 -0.156250 +v 0.187500 1.937500 -0.156250 +v 0.125000 2.562500 -0.093750 +v 0.125000 1.937500 -0.093750 +v 0.125000 2.562500 -0.156250 +v 0.125000 1.937500 -0.156250 +v -0.250001 2.625000 -0.156250 +v -0.250001 1.875000 -0.156250 +v -0.250001 2.625000 -0.093750 +v -0.250001 1.875000 -0.093750 +v -0.125001 2.625000 -0.156250 +v -0.125001 1.875000 -0.156250 +v -0.125001 2.625000 -0.093750 +v -0.125001 1.875000 -0.093750 +v -0.187501 2.562500 -0.156250 +v -0.187501 1.937500 -0.156250 +v -0.187501 2.562500 -0.093750 +v -0.187501 1.937500 -0.093750 +v -0.125001 2.562500 -0.156250 +v -0.125001 1.937500 -0.156250 +v -0.125001 2.562500 -0.093750 +v -0.125001 1.937500 -0.093750 +v -0.125000 2.375000 -0.562500 +v -0.000000 2.375000 -0.562500 +v -0.125000 2.286612 -0.525888 +v -0.000000 2.286612 -0.525888 +v -0.125000 2.250000 -0.437500 +v -0.000000 2.250000 -0.437500 +v -0.125000 2.286612 -0.349112 +v -0.000000 2.286612 -0.349112 +v -0.125000 2.375000 -0.312500 +v -0.000000 2.375000 -0.312500 +v -0.125000 2.463388 -0.349112 +v -0.000000 2.463388 -0.349112 +v -0.125000 2.500000 -0.437500 +v -0.000000 2.500000 -0.437500 +v -0.125000 2.463388 -0.525888 +v -0.000000 2.463388 -0.525888 +v -0.130000 1.875000 -0.234375 +v -0.130000 1.875000 -0.171875 +v -0.130000 2.062500 -0.234375 +v -0.130000 2.062500 -0.171875 +vt 0.750000 0.907407 +vt 0.723684 0.870370 +vt 0.750000 0.870370 +vt 0.750000 0.685185 +vt 0.723684 0.722222 +vt 0.723684 0.685185 +vt 0.802632 0.870370 +vt 0.828947 0.722222 +vt 0.828947 0.870370 +vt 0.776316 0.722222 +vt 0.776316 0.870370 +vt 0.750000 0.722222 +vt 0.802632 0.722222 +vt 0.875000 0.574074 +vt 0.861842 0.601852 +vt 0.861842 0.574074 +vt 0.875000 0.601852 +vt 0.901316 0.620370 +vt 0.875000 0.620370 +vt 0.901316 0.601852 +vt 0.914474 0.574074 +vt 0.914474 0.601852 +vt 0.901316 0.574074 +vt 0.940789 0.574074 +vt 0.940789 0.601852 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.694444 +vt 0.723684 0.685185 +vt 0.723684 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.710526 0.833333 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.703947 0.703704 +vt 0.710526 0.814815 +vt 0.703947 0.814815 +vt 0.710526 0.685185 +vt 0.710526 0.703704 +vt 0.710526 0.833333 +vt 0.703947 0.833333 +vt 0.723684 0.805556 +vt 0.717105 0.712963 +vt 0.723684 0.712963 +vt 0.717105 0.685185 +vt 0.723684 0.694444 +vt 0.717105 0.694444 +vt 0.723684 0.833333 +vt 0.717105 0.824074 +vt 0.723684 0.824074 +vt 0.697368 0.824074 +vt 0.717105 0.833333 +vt 0.717105 0.805556 +vt 0.697368 0.712963 +vt 0.703947 0.685185 +vt 0.697368 0.694444 +vt 0.697368 0.685185 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.706641 0.624161 +vt 0.697369 0.629566 +vt 0.688096 0.624161 +vt 0.559211 0.944444 +vt 0.460526 0.898148 +vt 0.559211 0.898148 +vt 0.723684 0.907407 +vt 0.717105 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.723684 0.685185 +vt 0.697368 0.833333 +vt 0.697368 0.805556 +vt 0.732956 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.688096 0.598061 +vt 0.697369 0.592656 +vt 0.706641 0.598061 +vt 0.710481 0.611111 +vt 0.460526 0.944444 +vt 0.763158 0.574074 +vt 0.776316 0.592593 +vt 0.763158 0.592593 +vt 0.776316 0.574074 +vt 0.789474 0.592593 +vt 0.684211 0.574074 +vt 0.697368 0.592593 +vt 0.684211 0.592593 +vt 0.697368 0.574074 +vt 0.710526 0.592593 +vt 0.710526 0.574074 +vt 0.723684 0.592593 +vt 0.723684 0.574074 +vt 0.736842 0.592593 +vt 0.736842 0.574074 +vt 0.750000 0.592593 +vt 0.750000 0.574074 +vt 0.789474 0.574074 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.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 -0.0000 -0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +s off +f 1/1/1 4/2/1 3/3/1 +f 6/4/2 8/5/2 7/6/2 +f 2/7/3 8/8/3 4/9/3 +f 3/3/4 6/10/4 1/11/4 +f 4/2/5 5/12/5 3/3/5 +f 1/11/6 7/13/6 2/7/6 +f 10/14/1 11/15/1 9/16/1 +f 12/17/5 13/18/5 11/19/5 +f 14/20/2 15/21/2 13/22/2 +f 16/23/3 12/17/3 10/14/3 +f 13/22/4 9/24/4 11/25/4 +f 18/26/3 19/27/3 17/28/3 +f 18/26/2 24/29/2 20/30/2 +f 19/27/1 21/31/1 17/28/1 +f 25/32/4 28/33/4 26/34/4 +f 28/35/1 30/36/1 26/37/1 +f 29/38/2 27/39/2 25/40/2 +f 21/31/6 25/41/6 17/28/6 +f 23/42/5 27/39/5 31/43/5 +f 20/30/5 27/44/5 19/27/5 +f 24/29/5 28/35/5 20/30/5 +f 17/28/6 26/45/6 18/26/6 +f 22/46/6 26/47/6 30/48/6 +f 34/49/4 35/50/4 33/51/4 +f 34/49/2 40/52/2 36/53/2 +f 33/51/1 39/54/1 37/55/1 +f 41/56/3 44/57/3 42/58/3 +f 48/59/1 42/60/1 44/61/1 +f 45/62/2 43/63/2 41/64/2 +f 37/55/5 41/65/5 33/51/5 +f 39/54/6 43/63/6 47/66/6 +f 36/53/6 43/67/6 35/50/6 +f 40/52/6 44/61/6 36/53/6 +f 33/51/5 42/68/5 34/49/5 +f 38/69/5 42/70/5 46/71/5 +f 62/72/3 58/73/3 54/74/3 +f 59/75/4 61/76/4 63/77/4 +f 66/78/4 67/79/4 65/80/4 +f 1/1/1 2/81/1 4/2/1 +f 6/4/2 5/12/2 8/5/2 +f 2/7/3 7/13/3 8/8/3 +f 3/3/4 5/12/4 6/10/4 +f 4/2/5 8/5/5 5/12/5 +f 1/11/6 6/10/6 7/13/6 +f 10/14/1 12/17/1 11/15/1 +f 12/17/5 14/20/5 13/18/5 +f 14/20/2 16/23/2 15/21/2 +f 16/23/3 14/20/3 12/17/3 +f 13/22/4 15/21/4 9/24/4 +f 18/26/3 20/30/3 19/27/3 +f 18/26/2 22/46/2 24/29/2 +f 19/27/1 23/42/1 21/31/1 +f 25/32/4 27/44/4 28/33/4 +f 28/35/1 32/82/1 30/36/1 +f 29/38/2 31/43/2 27/39/2 +f 21/31/6 29/83/6 25/41/6 +f 23/42/5 19/27/5 27/39/5 +f 20/30/5 28/33/5 27/44/5 +f 24/29/5 32/82/5 28/35/5 +f 17/28/6 25/84/6 26/45/6 +f 22/46/6 18/26/6 26/47/6 +f 34/49/4 36/53/4 35/50/4 +f 34/49/2 38/69/2 40/52/2 +f 33/51/1 35/50/1 39/54/1 +f 41/56/3 43/67/3 44/57/3 +f 48/59/1 46/85/1 42/60/1 +f 45/62/2 47/66/2 43/63/2 +f 37/55/5 45/86/5 41/65/5 +f 39/54/6 35/50/6 43/63/6 +f 36/53/6 44/57/6 43/67/6 +f 40/52/6 48/59/6 44/61/6 +f 33/51/5 41/87/5 42/68/5 +f 38/69/5 34/49/5 42/70/5 +f 54/74/3 52/88/3 50/89/3 +f 50/89/3 64/90/3 62/72/3 +f 62/72/3 60/91/3 58/73/3 +f 58/73/3 56/92/3 54/74/3 +f 54/74/3 50/89/3 62/72/3 +f 63/77/4 49/93/4 51/94/4 +f 51/94/4 53/95/4 63/77/4 +f 53/95/4 55/96/4 63/77/4 +f 55/96/4 57/97/4 63/77/4 +f 57/97/4 59/75/4 63/77/4 +f 66/78/4 68/98/4 67/79/4 +s 1 +f 50/99/5 51/100/7 49/101/5 +f 52/102/7 53/103/2 51/100/7 +f 54/104/2 55/105/8 53/106/2 +f 56/107/8 57/108/6 55/105/8 +f 58/109/6 59/110/9 57/108/6 +f 60/111/9 61/112/1 59/110/9 +f 62/113/1 63/114/10 61/112/1 +f 64/115/10 49/101/5 63/114/10 +f 50/99/5 52/102/7 51/100/7 +f 52/102/7 54/116/2 53/103/2 +f 54/104/2 56/107/8 55/105/8 +f 56/107/8 58/109/6 57/108/6 +f 58/109/6 60/111/9 59/110/9 +f 60/111/9 62/113/1 61/112/1 +f 62/113/1 64/115/10 63/114/10 +f 64/115/10 50/99/5 49/101/5 o Ring v -0.000000 1.250000 -1.375000 v -0.526190 1.250000 -1.270334 @@ -195,79 +492,79 @@ vt 0.210526 0.222222 vt 0.263158 0.240741 vt 0.263158 0.222222 vt 0.210526 0.259259 -vt 0.263158 0.277778 -vt 0.217105 0.277778 +vt 0.259868 0.277778 +vt 0.213816 0.277778 vt 0.157895 0.259259 -vt 0.210526 0.277778 -vt 0.164474 0.277778 +vt 0.207237 0.277778 +vt 0.161184 0.277778 vt 0.105263 0.259259 -vt 0.157895 0.277778 -vt 0.111842 0.277778 +vt 0.154605 0.277778 +vt 0.108553 0.277778 vt 0.052632 0.259259 -vt 0.105263 0.277778 -vt 0.059211 0.277778 +vt 0.101974 0.277778 +vt 0.055921 0.277778 vt -0.000000 0.259259 -vt 0.052632 0.277778 -vt 0.006579 0.277778 +vt 0.049342 0.277778 +vt 0.003289 0.277778 vt 0.842105 0.259259 -vt 0.796053 0.277778 +vt 0.792763 0.277778 vt 0.789474 0.259259 vt 0.736842 0.259259 -vt 0.789474 0.277778 -vt 0.743421 0.277778 -vt 0.690789 0.277778 +vt 0.786184 0.277778 +vt 0.740132 0.277778 +vt 0.687500 0.277778 vt 0.684211 0.259259 -vt 0.638158 0.277778 +vt 0.634869 0.277778 vt 0.631579 0.259259 -vt 0.585526 0.277778 +vt 0.582237 0.277778 vt 0.578947 0.259259 -vt 0.532895 0.277778 +vt 0.529605 0.277778 vt 0.526316 0.259259 -vt 0.480263 0.277778 +vt 0.476974 0.277778 vt 0.473684 0.259259 -vt 0.427632 0.277778 +vt 0.424342 0.277778 vt 0.421053 0.259259 -vt 0.375000 0.277778 +vt 0.371711 0.277778 vt 0.368421 0.259259 vt 0.315789 0.259259 -vt 0.368421 0.277778 -vt 0.322368 0.277778 +vt 0.365132 0.277778 +vt 0.319079 0.277778 vt 0.263158 0.259259 -vt 0.315789 0.277778 -vt 0.269737 0.277778 +vt 0.312500 0.277778 +vt 0.266447 0.277778 vt 0.263158 0.185185 -vt 0.315789 0.148148 +vt 0.312500 0.148148 vt 0.315789 0.185185 vt 0.210526 0.185185 -vt 0.263158 0.148148 +vt 0.259868 0.148148 vt 0.157895 0.185185 -vt 0.210526 0.148148 +vt 0.207237 0.148148 vt 0.105263 0.185185 -vt 0.157895 0.148148 +vt 0.154605 0.148148 vt 0.052632 0.185185 -vt 0.105263 0.148148 +vt 0.101974 0.148148 vt 0.000000 0.185185 -vt 0.052632 0.148148 -vt 0.796053 0.148148 +vt 0.049342 0.148148 +vt 0.792763 0.148148 vt 0.842105 0.185185 vt 0.789474 0.185185 -vt 0.743421 0.148148 +vt 0.740132 0.148148 vt 0.736842 0.185185 -vt 0.690789 0.148148 +vt 0.687500 0.148148 vt 0.684211 0.185185 -vt 0.638158 0.148148 +vt 0.634869 0.148148 vt 0.631579 0.185185 -vt 0.585526 0.148148 +vt 0.582237 0.148148 vt 0.578947 0.185185 -vt 0.532895 0.148148 +vt 0.529605 0.148148 vt 0.526316 0.185185 -vt 0.480263 0.148148 +vt 0.476974 0.148148 vt 0.473684 0.185185 -vt 0.427632 0.148148 +vt 0.424342 0.148148 vt 0.421053 0.185185 -vt 0.375000 0.148148 +vt 0.371711 0.148148 vt 0.368421 0.185185 -vt 0.368421 0.148148 +vt 0.365132 0.148148 vt 0.861842 0.490741 vt 0.796053 0.518519 vt 0.796053 0.490741 @@ -281,12 +578,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.688096 0.624161 -vt 0.688096 0.598061 -vt 0.706641 0.598061 +vt 0.720395 0.629566 +vt 0.707282 0.611111 +vt 0.720395 0.592656 +vt 0.684807 0.624161 +vt 0.684807 0.598061 +vt 0.703351 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -310,12 +607,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.688096 0.624161 -vt 0.688096 0.598061 -vt 0.706641 0.598061 +vt 0.720395 0.629566 +vt 0.707282 0.611111 +vt 0.720395 0.592656 +vt 0.684807 0.624161 +vt 0.684807 0.598061 +vt 0.703351 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -327,72 +624,72 @@ vt 0.894737 0.444444 vt 0.947368 0.444444 vt 0.934211 0.462963 vt 0.842105 0.240741 -vt 0.842105 0.277778 -vt 0.736842 0.277778 -vt 0.684211 0.277778 -vt 0.631579 0.277778 -vt 0.578947 0.277778 -vt 0.526316 0.277778 -vt 0.473684 0.277778 -vt 0.421053 0.277778 -vt 0.269737 0.148148 -vt 0.217105 0.148148 -vt 0.164474 0.148148 -vt 0.111842 0.148148 -vt 0.059211 0.148148 -vt 0.006579 0.148148 -vt 0.842105 0.148148 -vt 0.789474 0.148148 -vt 0.736842 0.148148 -vt 0.684211 0.148148 -vt 0.631579 0.148148 -vt 0.578947 0.148148 -vt 0.526316 0.148148 -vt 0.473684 0.148148 -vt 0.421053 0.148148 -vt 0.322368 0.148148 +vt 0.838816 0.277778 +vt 0.733553 0.277778 +vt 0.680921 0.277778 +vt 0.628289 0.277778 +vt 0.575658 0.277778 +vt 0.523026 0.277778 +vt 0.470395 0.277778 +vt 0.417763 0.277778 +vt 0.266447 0.148148 +vt 0.213816 0.148148 +vt 0.161184 0.148148 +vt 0.108553 0.148148 +vt 0.055921 0.148148 +vt 0.003289 0.148148 +vt 0.838816 0.148148 +vt 0.786184 0.148148 +vt 0.733553 0.148148 +vt 0.680921 0.148148 +vt 0.628289 0.148148 +vt 0.575658 0.148148 +vt 0.523026 0.148148 +vt 0.470395 0.148148 +vt 0.417763 0.148148 +vt 0.319079 0.148148 vt 0.947368 0.574074 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.697369 0.592656 -vt 0.710481 0.611111 -vt 0.706641 0.624161 -vt 0.697369 0.629566 +vt 0.729667 0.598061 +vt 0.733508 0.611111 +vt 0.729667 0.624161 +vt 0.711123 0.624161 +vt 0.711123 0.598061 +vt 0.680966 0.611111 +vt 0.694079 0.592656 +vt 0.707192 0.611111 +vt 0.703351 0.624161 +vt 0.694079 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.947368 0.574074 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.697369 0.592656 -vt 0.710481 0.611111 -vt 0.706641 0.624161 -vt 0.697369 0.629566 +vt 0.729667 0.598061 +vt 0.733508 0.611111 +vt 0.729667 0.624161 +vt 0.711123 0.624161 +vt 0.711123 0.598061 +vt 0.680966 0.611111 +vt 0.694079 0.592656 +vt 0.707192 0.611111 +vt 0.703351 0.624161 +vt 0.694079 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 -vt 0.322368 0.296296 -vt 0.796053 0.296296 -vt 0.375000 0.296296 -vt 0.006579 0.296296 -vt 0.427632 0.296296 -vt 0.059211 0.296296 -vt 0.480263 0.296296 -vt 0.111842 0.296296 -vt 0.532895 0.296296 -vt 0.164474 0.296296 -vt 0.638158 0.296296 -vt 0.585526 0.296296 -vt 0.217105 0.296296 -vt 0.690789 0.296296 -vt 0.269737 0.296296 -vt 0.743421 0.296296 +vt 0.319079 0.296296 +vt 0.792763 0.296296 +vt 0.371711 0.296296 +vt 0.003289 0.296296 +vt 0.424342 0.296296 +vt 0.055921 0.296296 +vt 0.476974 0.296296 +vt 0.108553 0.296296 +vt 0.529605 0.296296 +vt 0.161184 0.296296 +vt 0.634869 0.296296 +vt 0.582237 0.296296 +vt 0.213816 0.296296 +vt 0.687500 0.296296 +vt 0.266447 0.296296 +vt 0.740132 0.296296 vt 0.763158 0.574074 vt 0.776316 0.592593 vt 0.763158 0.592593 @@ -427,22 +724,22 @@ vt 0.736842 0.592593 vt 0.736842 0.574074 vt 0.750000 0.592593 vt 0.750000 0.574074 -vt 0.368421 0.296296 -vt 0.842105 0.296296 -vt 0.421053 0.296296 -vt 0.052632 0.296296 -vt 0.473684 0.296296 -vt 0.105263 0.296296 -vt 0.526316 0.296296 -vt 0.157895 0.296296 -vt 0.578947 0.296296 -vt 0.210526 0.296296 -vt 0.684211 0.296296 -vt 0.631579 0.296296 -vt 0.263158 0.296296 -vt 0.736842 0.296296 -vt 0.315789 0.296296 -vt 0.789474 0.296296 +vt 0.365132 0.296296 +vt 0.838816 0.296296 +vt 0.417763 0.296296 +vt 0.049342 0.296296 +vt 0.470395 0.296296 +vt 0.101974 0.296296 +vt 0.523026 0.296296 +vt 0.154605 0.296296 +vt 0.575658 0.296296 +vt 0.207237 0.296296 +vt 0.680921 0.296296 +vt 0.628289 0.296296 +vt 0.259868 0.296296 +vt 0.733553 0.296296 +vt 0.312500 0.296296 +vt 0.786184 0.296296 vt 0.789474 0.574074 vt 0.776316 0.574074 vn 0.0000 1.0000 0.0000 @@ -468,299 +765,299 @@ vn 0.0000 -0.7071 0.7071 vn 0.0000 0.7071 0.7071 vn 0.0000 0.7071 -0.7071 s off -f 27/1/1 44/2/1 43/3/1 -f 28/4/1 45/5/1 44/2/1 -f 30/6/1 45/5/1 29/7/1 -f 31/8/1 46/9/1 30/6/1 -f 32/10/1 47/11/1 31/8/1 -f 17/12/1 48/13/1 32/10/1 -f 18/14/1 33/15/1 17/12/1 -f 19/16/1 34/17/1 18/14/1 -f 20/18/1 35/19/1 19/16/1 -f 21/20/1 36/21/1 20/18/1 -f 22/22/1 37/23/1 21/24/1 -f 22/22/1 39/25/1 38/26/1 -f 23/27/1 40/28/1 39/25/1 -f 24/29/1 41/30/1 40/28/1 -f 25/31/1 42/32/1 41/30/1 -f 26/33/1 43/3/1 42/32/1 -f 57/34/1 74/35/1 73/36/1 -f 56/37/1 73/38/1 72/39/1 -f 55/40/1 72/41/1 71/42/1 -f 54/43/1 71/44/1 70/45/1 -f 53/46/1 70/47/1 69/48/1 -f 53/49/1 68/50/1 52/51/1 -f 51/52/1 68/53/1 67/54/1 -f 51/52/1 66/55/1 50/56/1 -f 50/56/1 65/57/1 49/58/1 -f 49/58/1 80/59/1 64/60/1 -f 64/60/1 79/61/1 63/62/1 -f 63/62/1 78/63/1 62/64/1 -f 62/64/1 77/65/1 61/66/1 -f 61/66/1 76/67/1 60/68/1 -f 59/69/1 76/70/1 75/71/1 -f 58/72/1 75/73/1 74/74/1 -f 10/75/2 91/76/2 11/77/2 -f 9/78/2 90/79/2 10/75/2 -f 8/80/2 89/81/2 9/78/2 -f 7/82/2 88/83/2 8/80/2 -f 6/84/2 87/85/2 7/82/2 -f 5/86/2 86/87/2 6/84/2 -f 84/88/2 5/89/2 4/90/2 -f 83/91/2 4/90/2 3/92/2 -f 82/93/2 3/92/2 2/94/2 -f 81/95/2 2/94/2 1/96/2 -f 96/97/2 1/96/2 16/98/2 -f 95/99/2 16/98/2 15/100/2 -f 94/101/2 15/100/2 14/102/2 -f 93/103/2 14/102/2 13/104/2 -f 92/105/2 13/104/2 12/106/2 -f 11/77/2 92/107/2 12/106/2 -f 99/108/2 98/109/2 97/110/2 -f 103/111/1 101/112/1 102/113/1 -f 98/109/3 102/114/3 97/115/3 -f 100/116/4 103/111/4 98/109/4 -f 97/117/5 101/118/5 99/119/5 -f 99/119/6 104/120/6 100/116/6 -f 118/121/4 114/122/4 110/123/4 -f 119/124/5 107/125/5 111/126/5 -f 127/127/1 125/128/1 126/129/1 -f 122/130/6 126/129/6 121/131/6 -f 124/132/5 127/133/5 122/130/5 -f 121/131/4 125/128/4 123/134/4 -f 123/135/3 128/136/3 124/132/3 -f 131/137/2 130/138/2 129/139/2 -f 135/140/1 133/141/1 134/142/1 -f 130/138/6 134/143/6 129/144/6 -f 132/145/5 135/140/5 130/138/5 -f 129/146/4 133/147/4 131/148/4 -f 131/148/3 136/149/3 132/145/3 -f 150/150/5 146/151/5 142/152/5 -f 151/153/4 139/154/4 143/155/4 -f 159/156/1 157/157/1 158/158/1 -f 154/159/3 158/158/3 153/160/3 -f 156/161/4 159/162/4 154/159/4 -f 153/160/5 157/157/5 155/163/5 -f 155/164/6 160/165/6 156/161/6 -f 27/1/1 28/4/1 44/2/1 -f 28/4/1 29/7/1 45/5/1 -f 30/6/1 46/9/1 45/5/1 -f 31/8/1 47/11/1 46/9/1 -f 32/10/1 48/13/1 47/11/1 -f 17/12/1 33/15/1 48/13/1 -f 18/14/1 34/17/1 33/15/1 -f 19/16/1 35/19/1 34/17/1 -f 20/18/1 36/21/1 35/19/1 -f 21/20/1 37/166/1 36/21/1 -f 22/22/1 38/26/1 37/23/1 -f 22/22/1 23/27/1 39/25/1 -f 23/27/1 24/29/1 40/28/1 -f 24/29/1 25/31/1 41/30/1 -f 25/31/1 26/33/1 42/32/1 -f 26/33/1 27/1/1 43/3/1 -f 57/34/1 58/72/1 74/35/1 -f 56/37/1 57/34/1 73/38/1 -f 55/40/1 56/37/1 72/41/1 -f 54/43/1 55/40/1 71/44/1 -f 53/46/1 54/43/1 70/47/1 -f 53/49/1 69/167/1 68/50/1 -f 51/52/1 52/51/1 68/53/1 -f 51/52/1 67/168/1 66/55/1 -f 50/56/1 66/169/1 65/57/1 -f 49/58/1 65/170/1 80/59/1 -f 64/60/1 80/171/1 79/61/1 -f 63/62/1 79/172/1 78/63/1 -f 62/64/1 78/173/1 77/65/1 -f 61/66/1 77/174/1 76/67/1 -f 59/69/1 60/68/1 76/70/1 -f 58/72/1 59/69/1 75/73/1 -f 10/75/2 90/175/2 91/76/2 -f 9/78/2 89/176/2 90/79/2 -f 8/80/2 88/177/2 89/81/2 -f 7/82/2 87/178/2 88/83/2 -f 6/84/2 86/179/2 87/85/2 -f 5/86/2 85/180/2 86/87/2 -f 84/88/2 85/181/2 5/89/2 -f 83/91/2 84/182/2 4/90/2 -f 82/93/2 83/183/2 3/92/2 -f 81/95/2 82/184/2 2/94/2 -f 96/97/2 81/185/2 1/96/2 -f 95/99/2 96/186/2 16/98/2 -f 94/101/2 95/187/2 15/100/2 -f 93/103/2 94/188/2 14/102/2 -f 92/105/2 93/189/2 13/104/2 -f 11/77/2 91/190/2 92/107/2 -f 99/108/2 100/116/2 98/109/2 -f 103/111/1 104/120/1 101/112/1 -f 98/109/3 103/111/3 102/114/3 -f 100/116/4 104/120/4 103/111/4 -f 97/117/5 102/191/5 101/118/5 -f 99/119/6 101/118/6 104/120/6 -f 110/123/4 108/192/4 106/193/4 -f 106/193/4 120/194/4 110/123/4 -f 120/194/4 118/121/4 110/123/4 -f 118/121/4 116/195/4 114/122/4 -f 114/122/4 112/196/4 110/123/4 -f 119/124/5 105/197/5 107/125/5 -f 107/125/5 109/198/5 111/126/5 -f 111/126/5 113/199/5 119/124/5 -f 113/199/5 115/200/5 119/124/5 -f 115/200/5 117/201/5 119/124/5 -f 127/127/1 128/202/1 125/128/1 -f 122/130/6 127/133/6 126/129/6 -f 124/132/5 128/136/5 127/133/5 -f 121/131/4 126/129/4 125/128/4 -f 123/135/3 125/203/3 128/136/3 -f 131/137/2 132/145/2 130/138/2 -f 135/140/1 136/149/1 133/141/1 -f 130/138/6 135/140/6 134/143/6 -f 132/145/5 136/149/5 135/140/5 -f 129/146/4 134/204/4 133/147/4 -f 131/148/3 133/147/3 136/149/3 -f 142/152/5 140/205/5 138/206/5 -f 138/206/5 152/207/5 142/152/5 -f 152/207/5 150/150/5 142/152/5 -f 150/150/5 148/208/5 146/151/5 -f 146/151/5 144/209/5 142/152/5 -f 151/153/4 137/210/4 139/154/4 -f 139/154/4 141/211/4 143/155/4 -f 143/155/4 145/212/4 151/153/4 -f 145/212/4 147/213/4 151/153/4 -f 147/213/4 149/214/4 151/153/4 -f 159/156/1 160/215/1 157/157/1 -f 154/159/3 159/162/3 158/158/3 -f 156/161/4 160/165/4 159/162/4 -f 153/160/5 158/158/5 157/157/5 -f 155/164/6 157/216/6 160/165/6 +f 95/117/11 112/118/11 111/119/11 +f 96/120/11 113/121/11 112/118/11 +f 98/122/11 113/121/11 97/123/11 +f 99/124/11 114/125/11 98/122/11 +f 100/126/11 115/127/11 99/124/11 +f 85/128/11 116/129/11 100/126/11 +f 86/130/11 101/131/11 85/128/11 +f 87/132/11 102/133/11 86/130/11 +f 88/134/11 103/135/11 87/132/11 +f 89/136/11 104/137/11 88/134/11 +f 90/138/11 105/139/11 89/140/11 +f 90/138/11 107/141/11 106/142/11 +f 91/143/11 108/144/11 107/141/11 +f 92/145/11 109/146/11 108/144/11 +f 93/147/11 110/148/11 109/146/11 +f 94/149/11 111/119/11 110/148/11 +f 125/150/11 142/151/11 141/152/11 +f 124/153/11 141/154/11 140/155/11 +f 123/156/11 140/157/11 139/158/11 +f 122/159/11 139/160/11 138/161/11 +f 121/162/11 138/163/11 137/164/11 +f 121/165/11 136/166/11 120/167/11 +f 119/168/11 136/169/11 135/170/11 +f 119/168/11 134/171/11 118/172/11 +f 118/172/11 133/173/11 117/174/11 +f 117/174/11 148/175/11 132/176/11 +f 132/176/11 147/177/11 131/178/11 +f 131/178/11 146/179/11 130/180/11 +f 130/180/11 145/181/11 129/182/11 +f 129/182/11 144/183/11 128/184/11 +f 127/185/11 144/186/11 143/187/11 +f 126/188/11 143/189/11 142/190/11 +f 78/191/12 159/192/12 79/193/12 +f 77/194/12 158/195/12 78/191/12 +f 76/196/12 157/197/12 77/194/12 +f 75/198/12 156/199/12 76/196/12 +f 74/200/12 155/201/12 75/198/12 +f 73/202/12 154/203/12 74/200/12 +f 152/204/12 73/205/12 72/206/12 +f 151/207/12 72/206/12 71/208/12 +f 150/209/12 71/208/12 70/210/12 +f 149/211/12 70/210/12 69/212/12 +f 164/213/12 69/212/12 84/214/12 +f 163/215/12 84/214/12 83/216/12 +f 162/217/12 83/216/12 82/218/12 +f 161/219/12 82/218/12 81/220/12 +f 160/221/12 81/220/12 80/222/12 +f 79/193/12 160/223/12 80/222/12 +f 167/224/12 166/225/12 165/226/12 +f 171/227/11 169/228/11 170/229/11 +f 166/225/13 170/230/13 165/231/13 +f 168/232/14 171/227/14 166/225/14 +f 165/233/15 169/234/15 167/235/15 +f 167/235/16 172/236/16 168/232/16 +f 186/237/14 182/238/14 178/239/14 +f 187/240/15 175/241/15 179/242/15 +f 195/243/11 193/244/11 194/245/11 +f 190/246/16 194/245/16 189/247/16 +f 192/248/15 195/249/15 190/246/15 +f 189/247/14 193/244/14 191/250/14 +f 191/251/13 196/252/13 192/248/13 +f 199/253/12 198/254/12 197/255/12 +f 203/256/11 201/257/11 202/258/11 +f 198/254/16 202/259/16 197/260/16 +f 200/261/15 203/256/15 198/254/15 +f 197/262/14 201/263/14 199/264/14 +f 199/264/13 204/265/13 200/261/13 +f 218/266/15 214/267/15 210/268/15 +f 219/269/14 207/270/14 211/271/14 +f 227/272/11 225/273/11 226/274/11 +f 222/275/13 226/274/13 221/276/13 +f 224/277/14 227/278/14 222/275/14 +f 221/276/15 225/273/15 223/279/15 +f 223/280/16 228/281/16 224/277/16 +f 95/117/11 96/120/11 112/118/11 +f 96/120/11 97/123/11 113/121/11 +f 98/122/11 114/125/11 113/121/11 +f 99/124/11 115/127/11 114/125/11 +f 100/126/11 116/129/11 115/127/11 +f 85/128/11 101/131/11 116/129/11 +f 86/130/11 102/133/11 101/131/11 +f 87/132/11 103/135/11 102/133/11 +f 88/134/11 104/137/11 103/135/11 +f 89/136/11 105/282/11 104/137/11 +f 90/138/11 106/142/11 105/139/11 +f 90/138/11 91/143/11 107/141/11 +f 91/143/11 92/145/11 108/144/11 +f 92/145/11 93/147/11 109/146/11 +f 93/147/11 94/149/11 110/148/11 +f 94/149/11 95/117/11 111/119/11 +f 125/150/11 126/188/11 142/151/11 +f 124/153/11 125/150/11 141/154/11 +f 123/156/11 124/153/11 140/157/11 +f 122/159/11 123/156/11 139/160/11 +f 121/162/11 122/159/11 138/163/11 +f 121/165/11 137/283/11 136/166/11 +f 119/168/11 120/167/11 136/169/11 +f 119/168/11 135/284/11 134/171/11 +f 118/172/11 134/285/11 133/173/11 +f 117/174/11 133/286/11 148/175/11 +f 132/176/11 148/287/11 147/177/11 +f 131/178/11 147/288/11 146/179/11 +f 130/180/11 146/289/11 145/181/11 +f 129/182/11 145/290/11 144/183/11 +f 127/185/11 128/184/11 144/186/11 +f 126/188/11 127/185/11 143/189/11 +f 78/191/12 158/291/12 159/192/12 +f 77/194/12 157/292/12 158/195/12 +f 76/196/12 156/293/12 157/197/12 +f 75/198/12 155/294/12 156/199/12 +f 74/200/12 154/295/12 155/201/12 +f 73/202/12 153/296/12 154/203/12 +f 152/204/12 153/297/12 73/205/12 +f 151/207/12 152/298/12 72/206/12 +f 150/209/12 151/299/12 71/208/12 +f 149/211/12 150/300/12 70/210/12 +f 164/213/12 149/301/12 69/212/12 +f 163/215/12 164/302/12 84/214/12 +f 162/217/12 163/303/12 83/216/12 +f 161/219/12 162/304/12 82/218/12 +f 160/221/12 161/305/12 81/220/12 +f 79/193/12 159/306/12 160/223/12 +f 167/224/12 168/232/12 166/225/12 +f 171/227/11 172/236/11 169/228/11 +f 166/225/13 171/227/13 170/230/13 +f 168/232/14 172/236/14 171/227/14 +f 165/233/15 170/307/15 169/234/15 +f 167/235/16 169/234/16 172/236/16 +f 178/239/14 176/308/14 174/309/14 +f 174/309/14 188/310/14 178/239/14 +f 188/310/14 186/237/14 178/239/14 +f 186/237/14 184/311/14 182/238/14 +f 182/238/14 180/312/14 178/239/14 +f 187/240/15 173/313/15 175/241/15 +f 175/241/15 177/314/15 179/242/15 +f 179/242/15 181/315/15 187/240/15 +f 181/315/15 183/316/15 187/240/15 +f 183/316/15 185/317/15 187/240/15 +f 195/243/11 196/318/11 193/244/11 +f 190/246/16 195/249/16 194/245/16 +f 192/248/15 196/252/15 195/249/15 +f 189/247/14 194/245/14 193/244/14 +f 191/251/13 193/319/13 196/252/13 +f 199/253/12 200/261/12 198/254/12 +f 203/256/11 204/265/11 201/257/11 +f 198/254/16 203/256/16 202/259/16 +f 200/261/15 204/265/15 203/256/15 +f 197/262/14 202/320/14 201/263/14 +f 199/264/13 201/263/13 204/265/13 +f 210/268/15 208/321/15 206/322/15 +f 206/322/15 220/323/15 210/268/15 +f 220/323/15 218/266/15 210/268/15 +f 218/266/15 216/324/15 214/267/15 +f 214/267/15 212/325/15 210/268/15 +f 219/269/14 205/326/14 207/270/14 +f 207/270/14 209/327/14 211/271/14 +f 211/271/14 213/328/14 219/269/14 +f 213/328/14 215/329/14 219/269/14 +f 215/329/14 217/330/14 219/269/14 +f 227/272/11 228/331/11 225/273/11 +f 222/275/13 227/278/13 226/274/13 +f 224/277/14 228/281/14 227/278/14 +f 221/276/15 226/274/15 225/273/15 +f 223/280/16 225/332/16 228/281/16 s 1 -f 13/104/4 28/4/7 12/106/7 -f 6/84/8 21/24/5 5/86/5 -f 14/102/9 29/7/4 13/104/4 -f 7/82/10 22/22/8 6/84/8 -f 15/100/11 30/6/9 14/102/9 -f 8/80/12 23/27/10 7/82/10 -f 16/98/13 31/8/11 15/100/11 -f 9/78/3 24/29/12 8/80/12 -f 2/94/14 17/12/6 1/96/6 -f 1/96/6 32/10/13 16/98/13 -f 10/75/15 25/31/3 9/78/3 -f 3/92/16 18/14/14 2/94/14 -f 11/77/17 26/33/15 10/75/15 -f 4/90/18 19/16/16 3/92/16 -f 12/106/7 27/1/17 11/77/17 -f 5/89/5 20/18/18 4/90/18 -f 34/17/15 49/58/3 33/15/3 -f 33/15/3 64/60/12 48/13/12 -f 42/32/14 57/34/6 41/30/6 -f 35/19/17 50/56/15 34/17/15 -f 43/3/16 58/72/14 42/32/14 -f 36/21/7 51/52/17 35/19/17 -f 44/2/18 59/69/16 43/3/16 -f 37/166/4 52/51/7 36/21/7 -f 45/5/5 60/68/18 44/2/18 -f 38/26/9 53/46/4 37/23/4 -f 46/9/8 61/66/5 45/5/5 -f 39/25/11 54/43/9 38/26/9 -f 47/11/10 62/64/8 46/9/8 -f 40/28/13 55/40/11 39/25/11 -f 48/13/12 63/62/10 47/11/10 -f 41/30/6 56/37/13 40/28/13 -f 76/70/18 91/217/16 75/71/16 -f 69/167/4 84/218/7 68/50/7 -f 77/174/5 92/219/18 76/67/18 -f 70/47/9 85/220/4 69/48/4 -f 78/173/8 93/221/5 77/65/5 -f 71/44/11 86/222/9 70/45/9 -f 79/172/10 94/223/8 78/63/8 -f 72/41/13 87/224/11 71/42/11 -f 80/171/12 95/225/10 79/61/10 -f 73/38/6 88/226/13 72/39/13 -f 66/169/15 81/227/3 65/57/3 -f 65/170/3 96/228/12 80/59/12 -f 74/35/14 89/229/6 73/36/6 -f 67/168/17 82/230/15 66/55/15 -f 75/73/16 90/231/14 74/74/14 -f 68/53/7 83/232/17 67/54/17 -f 106/233/6 107/234/19 105/235/6 -f 108/236/19 109/237/2 107/234/19 -f 110/238/2 111/239/20 109/240/2 -f 112/241/20 113/242/3 111/239/20 -f 114/243/3 115/244/21 113/242/3 -f 116/245/21 117/246/1 115/244/21 -f 118/247/1 119/248/22 117/246/1 -f 120/249/22 105/235/6 119/248/22 -f 138/250/3 139/251/20 137/252/3 -f 139/251/20 142/253/2 141/254/2 -f 142/255/2 143/256/19 141/257/2 -f 144/258/19 145/259/6 143/256/19 -f 146/260/6 147/261/22 145/259/6 -f 148/262/22 149/263/1 147/261/22 -f 150/264/1 151/265/21 149/263/1 -f 152/266/21 137/252/3 151/265/21 -f 13/104/4 29/7/4 28/4/7 -f 6/84/8 22/22/8 21/24/5 -f 14/102/9 30/6/9 29/7/4 -f 7/82/10 23/27/10 22/22/8 -f 15/100/11 31/8/11 30/6/9 -f 8/80/12 24/29/12 23/27/10 -f 16/98/13 32/10/13 31/8/11 -f 9/78/3 25/31/3 24/29/12 -f 2/94/14 18/14/14 17/12/6 -f 1/96/6 17/12/6 32/10/13 -f 10/75/15 26/33/15 25/31/3 -f 3/92/16 19/16/16 18/14/14 -f 11/77/17 27/1/17 26/33/15 -f 4/90/18 20/18/18 19/16/16 -f 12/106/7 28/4/7 27/1/17 -f 5/89/5 21/20/5 20/18/18 -f 34/17/15 50/56/15 49/58/3 -f 33/15/3 49/58/3 64/60/12 -f 42/32/14 58/72/14 57/34/6 -f 35/19/17 51/52/17 50/56/15 -f 43/3/16 59/69/16 58/72/14 -f 36/21/7 52/51/7 51/52/17 -f 44/2/18 60/68/18 59/69/16 -f 37/166/4 53/49/4 52/51/7 -f 45/5/5 61/66/5 60/68/18 -f 38/26/9 54/43/9 53/46/4 -f 46/9/8 62/64/8 61/66/5 -f 39/25/11 55/40/11 54/43/9 -f 47/11/10 63/62/10 62/64/8 -f 40/28/13 56/37/13 55/40/11 -f 48/13/12 64/60/12 63/62/10 -f 41/30/6 57/34/6 56/37/13 -f 76/70/18 92/267/18 91/217/16 -f 69/167/4 85/268/4 84/218/7 -f 77/174/5 93/269/5 92/219/18 -f 70/47/9 86/270/9 85/220/4 -f 78/173/8 94/271/8 93/221/5 -f 71/44/11 87/272/11 86/222/9 -f 79/172/10 95/273/10 94/223/8 -f 72/41/13 88/274/13 87/224/11 -f 80/171/12 96/275/12 95/225/10 -f 73/38/6 89/276/6 88/226/13 -f 66/169/15 82/277/15 81/227/3 -f 65/170/3 81/278/3 96/228/12 -f 74/35/14 90/279/14 89/229/6 -f 67/168/17 83/280/17 82/230/15 -f 75/73/16 91/281/16 90/231/14 -f 68/53/7 84/282/7 83/232/17 -f 106/233/6 108/236/19 107/234/19 -f 108/236/19 110/283/2 109/237/2 -f 110/238/2 112/241/20 111/239/20 -f 112/241/20 114/243/3 113/242/3 -f 114/243/3 116/245/21 115/244/21 -f 116/245/21 118/247/1 117/246/1 -f 118/247/1 120/249/22 119/248/22 -f 120/249/22 106/233/6 105/235/6 -f 138/250/3 140/284/20 139/251/20 -f 139/251/20 140/284/20 142/253/2 -f 142/255/2 144/258/19 143/256/19 -f 144/258/19 146/260/6 145/259/6 -f 146/260/6 148/262/22 147/261/22 -f 148/262/22 150/264/1 149/263/1 -f 150/264/1 152/266/21 151/265/21 -f 152/266/21 138/250/3 137/252/3 +f 81/220/14 96/120/17 80/222/17 +f 74/200/18 89/140/15 73/202/15 +f 82/218/19 97/123/14 81/220/14 +f 75/198/20 90/138/18 74/200/18 +f 83/216/21 98/122/19 82/218/19 +f 76/196/22 91/143/20 75/198/20 +f 84/214/23 99/124/21 83/216/21 +f 77/194/13 92/145/22 76/196/22 +f 70/210/24 85/128/16 69/212/16 +f 69/212/16 100/126/23 84/214/23 +f 78/191/25 93/147/13 77/194/13 +f 71/208/26 86/130/24 70/210/24 +f 79/193/27 94/149/25 78/191/25 +f 72/206/28 87/132/26 71/208/26 +f 80/222/17 95/117/27 79/193/27 +f 73/205/15 88/134/28 72/206/28 +f 102/133/25 117/174/13 101/131/13 +f 101/131/13 132/176/22 116/129/22 +f 110/148/24 125/150/16 109/146/16 +f 103/135/27 118/172/25 102/133/25 +f 111/119/26 126/188/24 110/148/24 +f 104/137/17 119/168/27 103/135/27 +f 112/118/28 127/185/26 111/119/26 +f 105/282/14 120/167/17 104/137/17 +f 113/121/15 128/184/28 112/118/28 +f 106/142/19 121/162/14 105/139/14 +f 114/125/18 129/182/15 113/121/15 +f 107/141/21 122/159/19 106/142/19 +f 115/127/20 130/180/18 114/125/18 +f 108/144/23 123/156/21 107/141/21 +f 116/129/22 131/178/20 115/127/20 +f 109/146/16 124/153/23 108/144/23 +f 144/186/28 159/333/26 143/187/26 +f 137/283/14 152/334/17 136/166/17 +f 145/290/15 160/335/28 144/183/28 +f 138/163/19 153/336/14 137/164/14 +f 146/289/18 161/337/15 145/181/15 +f 139/160/21 154/338/19 138/161/19 +f 147/288/20 162/339/18 146/179/18 +f 140/157/23 155/340/21 139/158/21 +f 148/287/22 163/341/20 147/177/20 +f 141/154/16 156/342/23 140/155/23 +f 134/285/25 149/343/13 133/173/13 +f 133/286/13 164/344/22 148/175/22 +f 142/151/24 157/345/16 141/152/16 +f 135/284/27 150/346/25 134/171/25 +f 143/189/26 158/347/24 142/190/24 +f 136/169/17 151/348/27 135/170/27 +f 174/349/16 175/350/29 173/351/16 +f 176/352/29 177/353/12 175/350/29 +f 178/354/12 179/355/30 177/356/12 +f 180/357/30 181/358/13 179/355/30 +f 182/359/13 183/360/31 181/358/13 +f 184/361/31 185/362/11 183/360/31 +f 186/363/11 187/364/32 185/362/11 +f 188/365/32 173/351/16 187/364/32 +f 206/366/13 207/367/30 205/368/13 +f 207/367/30 210/369/12 209/370/12 +f 210/371/12 211/372/29 209/373/12 +f 212/374/29 213/375/16 211/372/29 +f 214/376/16 215/377/32 213/375/16 +f 216/378/32 217/379/11 215/377/32 +f 218/380/11 219/381/31 217/379/11 +f 220/382/31 205/368/13 219/381/31 +f 81/220/14 97/123/14 96/120/17 +f 74/200/18 90/138/18 89/140/15 +f 82/218/19 98/122/19 97/123/14 +f 75/198/20 91/143/20 90/138/18 +f 83/216/21 99/124/21 98/122/19 +f 76/196/22 92/145/22 91/143/20 +f 84/214/23 100/126/23 99/124/21 +f 77/194/13 93/147/13 92/145/22 +f 70/210/24 86/130/24 85/128/16 +f 69/212/16 85/128/16 100/126/23 +f 78/191/25 94/149/25 93/147/13 +f 71/208/26 87/132/26 86/130/24 +f 79/193/27 95/117/27 94/149/25 +f 72/206/28 88/134/28 87/132/26 +f 80/222/17 96/120/17 95/117/27 +f 73/205/15 89/136/15 88/134/28 +f 102/133/25 118/172/25 117/174/13 +f 101/131/13 117/174/13 132/176/22 +f 110/148/24 126/188/24 125/150/16 +f 103/135/27 119/168/27 118/172/25 +f 111/119/26 127/185/26 126/188/24 +f 104/137/17 120/167/17 119/168/27 +f 112/118/28 128/184/28 127/185/26 +f 105/282/14 121/165/14 120/167/17 +f 113/121/15 129/182/15 128/184/28 +f 106/142/19 122/159/19 121/162/14 +f 114/125/18 130/180/18 129/182/15 +f 107/141/21 123/156/21 122/159/19 +f 115/127/20 131/178/20 130/180/18 +f 108/144/23 124/153/23 123/156/21 +f 116/129/22 132/176/22 131/178/20 +f 109/146/16 125/150/16 124/153/23 +f 144/186/28 160/383/28 159/333/26 +f 137/283/14 153/384/14 152/334/17 +f 145/290/15 161/385/15 160/335/28 +f 138/163/19 154/386/19 153/336/14 +f 146/289/18 162/387/18 161/337/15 +f 139/160/21 155/388/21 154/338/19 +f 147/288/20 163/389/20 162/339/18 +f 140/157/23 156/390/23 155/340/21 +f 148/287/22 164/391/22 163/341/20 +f 141/154/16 157/392/16 156/342/23 +f 134/285/25 150/393/25 149/343/13 +f 133/286/13 149/394/13 164/344/22 +f 142/151/24 158/395/24 157/345/16 +f 135/284/27 151/396/27 150/346/25 +f 143/189/26 159/397/26 158/347/24 +f 136/169/17 152/398/17 151/348/27 +f 174/349/16 176/352/29 175/350/29 +f 176/352/29 178/399/12 177/353/12 +f 178/354/12 180/357/30 179/355/30 +f 180/357/30 182/359/13 181/358/13 +f 182/359/13 184/361/31 183/360/31 +f 184/361/31 186/363/11 185/362/11 +f 186/363/11 188/365/32 187/364/32 +f 188/365/32 174/349/16 173/351/16 +f 206/366/13 208/400/30 207/367/30 +f 207/367/30 208/400/30 210/369/12 +f 210/371/12 212/374/29 211/372/29 +f 212/374/29 214/376/16 213/375/16 +f 214/376/16 216/378/32 215/377/32 +f 216/378/32 218/380/11 217/379/11 +f 218/380/11 220/382/31 219/381/31 +f 220/382/31 206/366/13 205/368/13 o ArmLower1 v 0.031250 1.625000 0.875000 v 0.093750 1.625000 0.875000 @@ -891,71 +1188,71 @@ vn 0.0000 0.7071 -0.7071 vn 0.0000 1.0000 -0.0000 vn 0.0000 0.7071 0.7071 s off -f 163/285/23 165/286/23 164/287/23 -f 162/288/24 166/289/24 163/285/24 -f 161/290/25 168/291/25 162/292/25 -f 164/287/26 167/293/26 161/290/26 -f 182/294/26 178/295/26 174/296/26 -f 183/297/24 171/298/24 175/299/24 -f 198/300/26 194/301/26 190/302/26 -f 195/303/24 197/304/24 199/305/24 -f 163/285/23 166/289/23 165/286/23 -f 162/288/24 168/306/24 166/289/24 -f 161/290/25 167/293/25 168/291/25 -f 164/287/26 165/286/26 167/293/26 -f 174/296/26 172/307/26 170/308/26 -f 170/308/26 184/309/26 174/296/26 -f 184/309/26 182/294/26 174/296/26 -f 182/294/26 180/310/26 178/295/26 -f 178/295/26 176/311/26 174/296/26 -f 183/297/24 169/312/24 171/298/24 -f 171/298/24 173/313/24 175/299/24 -f 175/299/24 177/314/24 183/297/24 -f 177/314/24 179/315/24 183/297/24 -f 179/315/24 181/316/24 183/297/24 -f 190/302/26 188/317/26 186/318/26 -f 186/318/26 200/319/26 198/300/26 -f 198/300/26 196/320/26 194/301/26 -f 194/301/26 192/321/26 190/302/26 -f 190/302/26 186/318/26 198/300/26 -f 199/305/24 185/322/24 187/323/24 -f 187/323/24 189/324/24 199/305/24 -f 189/324/24 191/325/24 199/305/24 -f 191/325/24 193/326/24 199/305/24 -f 193/326/24 195/303/24 199/305/24 +f 231/401/33 233/402/33 232/403/33 +f 230/404/34 234/405/34 231/401/34 +f 229/406/35 236/407/35 230/408/35 +f 232/403/36 235/409/36 229/406/36 +f 250/410/36 246/411/36 242/412/36 +f 251/413/34 239/414/34 243/415/34 +f 266/416/36 262/417/36 258/418/36 +f 263/419/34 265/420/34 267/421/34 +f 231/401/33 234/405/33 233/402/33 +f 230/404/34 236/422/34 234/405/34 +f 229/406/35 235/409/35 236/407/35 +f 232/403/36 233/402/36 235/409/36 +f 242/412/36 240/423/36 238/424/36 +f 238/424/36 252/425/36 242/412/36 +f 252/425/36 250/410/36 242/412/36 +f 250/410/36 248/426/36 246/411/36 +f 246/411/36 244/427/36 242/412/36 +f 251/413/34 237/428/34 239/414/34 +f 239/414/34 241/429/34 243/415/34 +f 243/415/34 245/430/34 251/413/34 +f 245/430/34 247/431/34 251/413/34 +f 247/431/34 249/432/34 251/413/34 +f 258/418/36 256/433/36 254/434/36 +f 254/434/36 268/435/36 266/416/36 +f 266/416/36 264/436/36 262/417/36 +f 262/417/36 260/437/36 258/418/36 +f 258/418/36 254/434/36 266/416/36 +f 267/421/34 253/438/34 255/439/34 +f 255/439/34 257/440/34 267/421/34 +f 257/440/34 259/441/34 267/421/34 +f 259/441/34 261/442/34 267/421/34 +f 261/442/34 263/419/34 267/421/34 s 1 -f 170/327/23 171/328/27 169/329/23 -f 172/330/27 173/331/28 171/328/27 -f 174/332/28 175/333/29 173/334/28 -f 176/335/29 177/336/25 175/333/29 -f 178/337/25 179/338/30 177/336/25 -f 180/339/30 181/340/31 179/338/30 -f 182/341/31 183/342/32 181/340/31 -f 184/343/32 169/329/23 183/342/32 -f 186/344/23 187/345/27 185/346/23 -f 188/347/27 189/348/28 187/345/27 -f 190/349/28 191/350/29 189/351/28 -f 192/352/29 193/353/25 191/350/29 -f 194/354/25 195/355/30 193/353/25 -f 195/355/30 198/356/31 197/357/31 -f 198/356/31 199/358/32 197/357/31 -f 200/359/32 185/346/23 199/358/32 -f 170/327/23 172/330/27 171/328/27 -f 172/330/27 174/360/28 173/331/28 -f 174/332/28 176/335/29 175/333/29 -f 176/335/29 178/337/25 177/336/25 -f 178/337/25 180/339/30 179/338/30 -f 180/339/30 182/341/31 181/340/31 -f 182/341/31 184/343/32 183/342/32 -f 184/343/32 170/327/23 169/329/23 -f 186/344/23 188/347/27 187/345/27 -f 188/347/27 190/361/28 189/348/28 -f 190/349/28 192/352/29 191/350/29 -f 192/352/29 194/354/25 193/353/25 -f 194/354/25 196/362/30 195/355/30 -f 195/355/30 196/362/30 198/356/31 -f 198/356/31 200/359/32 199/358/32 -f 200/359/32 186/344/23 185/346/23 +f 238/443/33 239/444/37 237/445/33 +f 240/446/37 241/447/38 239/444/37 +f 242/448/38 243/449/39 241/450/38 +f 244/451/39 245/452/35 243/449/39 +f 246/453/35 247/454/40 245/452/35 +f 248/455/40 249/456/41 247/454/40 +f 250/457/41 251/458/42 249/456/41 +f 252/459/42 237/445/33 251/458/42 +f 254/460/33 255/461/37 253/462/33 +f 256/463/37 257/464/38 255/461/37 +f 258/465/38 259/466/39 257/467/38 +f 260/468/39 261/469/35 259/466/39 +f 262/470/35 263/471/40 261/469/35 +f 263/471/40 266/472/41 265/473/41 +f 266/472/41 267/474/42 265/473/41 +f 268/475/42 253/462/33 267/474/42 +f 238/443/33 240/446/37 239/444/37 +f 240/446/37 242/476/38 241/447/38 +f 242/448/38 244/451/39 243/449/39 +f 244/451/39 246/453/35 245/452/35 +f 246/453/35 248/455/40 247/454/40 +f 248/455/40 250/457/41 249/456/41 +f 250/457/41 252/459/42 251/458/42 +f 252/459/42 238/443/33 237/445/33 +f 254/460/33 256/463/37 255/461/37 +f 256/463/37 258/477/38 257/464/38 +f 258/465/38 260/468/39 259/466/39 +f 260/468/39 262/470/35 261/469/35 +f 262/470/35 264/478/40 263/471/40 +f 263/471/40 264/478/40 266/472/41 +f 266/472/41 268/475/42 267/474/42 +f 268/475/42 254/460/33 253/462/33 o ArmLower2 v -0.031250 1.625000 -0.875000 v -0.093750 1.625000 -0.875000 @@ -1086,71 +1383,71 @@ vn 0.0000 0.7071 0.7071 vn 0.0000 1.0000 0.0000 vn 0.0000 0.7071 -0.7071 s off -f 203/363/33 205/364/33 204/365/33 -f 202/366/34 206/367/34 203/363/34 -f 201/368/35 208/369/35 202/370/35 -f 204/365/36 207/371/36 201/368/36 -f 222/372/36 218/373/36 214/374/36 -f 223/375/34 211/376/34 215/377/34 -f 238/378/36 234/379/36 230/380/36 -f 235/381/34 237/382/34 239/383/34 -f 203/363/33 206/367/33 205/364/33 -f 202/366/34 208/384/34 206/367/34 -f 201/368/35 207/371/35 208/369/35 -f 204/365/36 205/364/36 207/371/36 -f 214/374/36 212/385/36 210/386/36 -f 210/386/36 224/387/36 214/374/36 -f 224/387/36 222/372/36 214/374/36 -f 222/372/36 220/388/36 218/373/36 -f 218/373/36 216/389/36 214/374/36 -f 223/375/34 209/390/34 211/376/34 -f 211/376/34 213/391/34 215/377/34 -f 215/377/34 217/392/34 223/375/34 -f 217/392/34 219/393/34 223/375/34 -f 219/393/34 221/394/34 223/375/34 -f 230/380/36 228/395/36 226/396/36 -f 226/396/36 240/397/36 238/378/36 -f 238/378/36 236/398/36 234/379/36 -f 234/379/36 232/399/36 230/380/36 -f 230/380/36 226/396/36 238/378/36 -f 239/383/34 225/400/34 227/401/34 -f 227/401/34 229/402/34 239/383/34 -f 229/402/34 231/403/34 239/383/34 -f 231/403/34 233/404/34 239/383/34 -f 233/404/34 235/381/34 239/383/34 +f 271/479/43 273/480/43 272/481/43 +f 270/482/44 274/483/44 271/479/44 +f 269/484/45 276/485/45 270/486/45 +f 272/481/46 275/487/46 269/484/46 +f 290/488/46 286/489/46 282/490/46 +f 291/491/44 279/492/44 283/493/44 +f 306/494/46 302/495/46 298/496/46 +f 303/497/44 305/498/44 307/499/44 +f 271/479/43 274/483/43 273/480/43 +f 270/482/44 276/500/44 274/483/44 +f 269/484/45 275/487/45 276/485/45 +f 272/481/46 273/480/46 275/487/46 +f 282/490/46 280/501/46 278/502/46 +f 278/502/46 292/503/46 282/490/46 +f 292/503/46 290/488/46 282/490/46 +f 290/488/46 288/504/46 286/489/46 +f 286/489/46 284/505/46 282/490/46 +f 291/491/44 277/506/44 279/492/44 +f 279/492/44 281/507/44 283/493/44 +f 283/493/44 285/508/44 291/491/44 +f 285/508/44 287/509/44 291/491/44 +f 287/509/44 289/510/44 291/491/44 +f 298/496/46 296/511/46 294/512/46 +f 294/512/46 308/513/46 306/494/46 +f 306/494/46 304/514/46 302/495/46 +f 302/495/46 300/515/46 298/496/46 +f 298/496/46 294/512/46 306/494/46 +f 307/499/44 293/516/44 295/517/44 +f 295/517/44 297/518/44 307/499/44 +f 297/518/44 299/519/44 307/499/44 +f 299/519/44 301/520/44 307/499/44 +f 301/520/44 303/497/44 307/499/44 s 1 -f 210/405/33 211/406/37 209/407/33 -f 212/408/37 213/409/38 211/406/37 -f 214/410/38 215/411/39 213/412/38 -f 216/413/39 217/414/35 215/411/39 -f 218/415/35 219/416/40 217/414/35 -f 220/417/40 221/418/41 219/416/40 -f 222/419/41 223/420/42 221/418/41 -f 224/421/42 209/407/33 223/420/42 -f 226/422/33 227/423/37 225/424/33 -f 228/425/37 229/426/38 227/423/37 -f 230/427/38 231/428/39 229/429/38 -f 232/430/39 233/431/35 231/428/39 -f 234/432/35 235/433/40 233/431/35 -f 236/434/40 237/435/41 235/433/40 -f 238/436/41 239/437/42 237/435/41 -f 240/438/42 225/424/33 239/437/42 -f 210/405/33 212/408/37 211/406/37 -f 212/408/37 214/439/38 213/409/38 -f 214/410/38 216/413/39 215/411/39 -f 216/413/39 218/415/35 217/414/35 -f 218/415/35 220/417/40 219/416/40 -f 220/417/40 222/419/41 221/418/41 -f 222/419/41 224/421/42 223/420/42 -f 224/421/42 210/405/33 209/407/33 -f 226/422/33 228/425/37 227/423/37 -f 228/425/37 230/440/38 229/426/38 -f 230/427/38 232/430/39 231/428/39 -f 232/430/39 234/432/35 233/431/35 -f 234/432/35 236/434/40 235/433/40 -f 236/434/40 238/436/41 237/435/41 -f 238/436/41 240/438/42 239/437/42 -f 240/438/42 226/422/33 225/424/33 +f 278/521/43 279/522/47 277/523/43 +f 280/524/47 281/525/48 279/522/47 +f 282/526/48 283/527/49 281/528/48 +f 284/529/49 285/530/45 283/527/49 +f 286/531/45 287/532/50 285/530/45 +f 288/533/50 289/534/51 287/532/50 +f 290/535/51 291/536/52 289/534/51 +f 292/537/52 277/523/43 291/536/52 +f 294/538/43 295/539/47 293/540/43 +f 296/541/47 297/542/48 295/539/47 +f 298/543/48 299/544/49 297/545/48 +f 300/546/49 301/547/45 299/544/49 +f 302/548/45 303/549/50 301/547/45 +f 304/550/50 305/551/51 303/549/50 +f 306/552/51 307/553/52 305/551/51 +f 308/554/52 293/540/43 307/553/52 +f 278/521/43 280/524/47 279/522/47 +f 280/524/47 282/555/48 281/525/48 +f 282/526/48 284/529/49 283/527/49 +f 284/529/49 286/531/45 285/530/45 +f 286/531/45 288/533/50 287/532/50 +f 288/533/50 290/535/51 289/534/51 +f 290/535/51 292/537/52 291/536/52 +f 292/537/52 278/521/43 277/523/43 +f 294/538/43 296/541/47 295/539/47 +f 296/541/47 298/556/48 297/542/48 +f 298/543/48 300/546/49 299/544/49 +f 300/546/49 302/548/45 301/547/45 +f 302/548/45 304/550/50 303/549/50 +f 304/550/50 306/552/51 305/551/51 +f 306/552/51 308/554/52 307/553/52 +f 308/554/52 294/538/43 293/540/43 o ArmUpper2 v 0.031250 2.312500 -0.937500 v 0.093750 2.312500 -0.937500 @@ -1281,71 +1578,71 @@ vn 0.0000 0.0000 1.0000 vn 0.0000 0.7071 0.7071 vn 0.0000 0.7071 -0.7071 s off -f 243/441/43 248/442/43 244/443/43 -f 242/444/44 246/445/44 241/446/44 -f 244/443/45 247/447/45 242/444/45 -f 241/448/46 245/449/46 243/441/46 -f 262/450/45 258/451/45 254/452/45 -f 259/453/46 261/454/46 263/455/46 -f 278/456/45 274/457/45 270/458/45 -f 275/459/46 277/460/46 279/461/46 -f 243/441/43 245/449/43 248/442/43 -f 242/444/44 247/447/44 246/445/44 -f 244/443/45 248/442/45 247/447/45 -f 241/448/46 246/462/46 245/449/46 -f 254/452/45 252/463/45 250/464/45 -f 250/464/45 264/465/45 262/450/45 -f 262/450/45 260/466/45 258/451/45 -f 258/451/45 256/467/45 254/452/45 -f 254/452/45 250/464/45 262/450/45 -f 263/455/46 249/468/46 251/469/46 -f 251/469/46 253/470/46 263/455/46 -f 253/470/46 255/471/46 263/455/46 -f 255/471/46 257/472/46 263/455/46 -f 257/472/46 259/453/46 263/455/46 -f 270/458/45 268/473/45 266/474/45 -f 266/474/45 280/475/45 278/456/45 -f 278/456/45 276/476/45 274/457/45 -f 274/457/45 272/477/45 270/458/45 -f 270/458/45 266/474/45 278/456/45 -f 279/461/46 265/478/46 267/479/46 -f 267/479/46 269/480/46 279/461/46 -f 269/480/46 271/481/46 279/461/46 -f 271/481/46 273/482/46 279/461/46 -f 273/482/46 275/459/46 279/461/46 +f 311/557/53 316/558/53 312/559/53 +f 310/560/54 314/561/54 309/562/54 +f 312/559/55 315/563/55 310/560/55 +f 309/564/56 313/565/56 311/557/56 +f 330/566/55 326/567/55 322/568/55 +f 327/569/56 329/570/56 331/571/56 +f 346/572/55 342/573/55 338/574/55 +f 343/575/56 345/576/56 347/577/56 +f 311/557/53 313/565/53 316/558/53 +f 310/560/54 315/563/54 314/561/54 +f 312/559/55 316/558/55 315/563/55 +f 309/564/56 314/578/56 313/565/56 +f 322/568/55 320/579/55 318/580/55 +f 318/580/55 332/581/55 330/566/55 +f 330/566/55 328/582/55 326/567/55 +f 326/567/55 324/583/55 322/568/55 +f 322/568/55 318/580/55 330/566/55 +f 331/571/56 317/584/56 319/585/56 +f 319/585/56 321/586/56 331/571/56 +f 321/586/56 323/587/56 331/571/56 +f 323/587/56 325/588/56 331/571/56 +f 325/588/56 327/569/56 331/571/56 +f 338/574/55 336/589/55 334/590/55 +f 334/590/55 348/591/55 346/572/55 +f 346/572/55 344/592/55 342/573/55 +f 342/573/55 340/593/55 338/574/55 +f 338/574/55 334/590/55 346/572/55 +f 347/577/56 333/594/56 335/595/56 +f 335/595/56 337/596/56 347/577/56 +f 337/596/56 339/597/56 347/577/56 +f 339/597/56 341/598/56 347/577/56 +f 341/598/56 343/575/56 347/577/56 s 1 -f 250/483/47 251/484/48 249/485/47 -f 252/486/48 253/487/44 251/484/48 -f 254/488/44 255/489/49 253/490/44 -f 256/491/49 257/492/50 255/489/49 -f 258/493/50 259/494/51 257/492/50 -f 260/495/51 261/496/43 259/494/51 -f 262/497/43 263/498/52 261/496/43 -f 264/499/52 249/485/47 263/498/52 -f 266/500/47 267/501/48 265/502/47 -f 268/503/48 269/504/44 267/501/48 -f 270/505/44 271/506/49 269/507/44 -f 272/508/49 273/509/50 271/506/49 -f 274/510/50 275/511/51 273/509/50 -f 276/512/51 277/513/43 275/511/51 -f 278/514/43 279/515/52 277/513/43 -f 280/516/52 265/502/47 279/515/52 -f 250/483/47 252/486/48 251/484/48 -f 252/486/48 254/517/44 253/487/44 -f 254/488/44 256/491/49 255/489/49 -f 256/491/49 258/493/50 257/492/50 -f 258/493/50 260/495/51 259/494/51 -f 260/495/51 262/497/43 261/496/43 -f 262/497/43 264/499/52 263/498/52 -f 264/499/52 250/483/47 249/485/47 -f 266/500/47 268/503/48 267/501/48 -f 268/503/48 270/518/44 269/504/44 -f 270/505/44 272/508/49 271/506/49 -f 272/508/49 274/510/50 273/509/50 -f 274/510/50 276/512/51 275/511/51 -f 276/512/51 278/514/43 277/513/43 -f 278/514/43 280/516/52 279/515/52 -f 280/516/52 266/500/47 265/502/47 +f 318/599/57 319/600/58 317/601/57 +f 320/602/58 321/603/54 319/600/58 +f 322/604/54 323/605/59 321/606/54 +f 324/607/59 325/608/60 323/605/59 +f 326/609/60 327/610/61 325/608/60 +f 328/611/61 329/612/53 327/610/61 +f 330/613/53 331/614/62 329/612/53 +f 332/615/62 317/601/57 331/614/62 +f 334/616/57 335/617/58 333/618/57 +f 336/619/58 337/620/54 335/617/58 +f 338/621/54 339/622/59 337/623/54 +f 340/624/59 341/625/60 339/622/59 +f 342/626/60 343/627/61 341/625/60 +f 344/628/61 345/629/53 343/627/61 +f 346/630/53 347/631/62 345/629/53 +f 348/632/62 333/618/57 347/631/62 +f 318/599/57 320/602/58 319/600/58 +f 320/602/58 322/633/54 321/603/54 +f 322/604/54 324/607/59 323/605/59 +f 324/607/59 326/609/60 325/608/60 +f 326/609/60 328/611/61 327/610/61 +f 328/611/61 330/613/53 329/612/53 +f 330/613/53 332/615/62 331/614/62 +f 332/615/62 318/599/57 317/601/57 +f 334/616/57 336/619/58 335/617/58 +f 336/619/58 338/634/54 337/620/54 +f 338/621/54 340/624/59 339/622/59 +f 340/624/59 342/626/60 341/625/60 +f 342/626/60 344/628/61 343/627/61 +f 344/628/61 346/630/53 345/629/53 +f 346/630/53 348/632/62 347/631/62 +f 348/632/62 334/616/57 333/618/57 o ArmUpper1 v -0.031250 2.312500 0.937500 v -0.093750 2.312500 0.937500 @@ -1476,358 +1773,71 @@ vn 0.0000 0.0000 -1.0000 vn 0.0000 0.7071 -0.7071 vn 0.0000 0.7071 0.7071 s off -f 283/519/53 288/520/53 284/521/53 -f 282/522/54 286/523/54 281/524/54 -f 284/521/55 287/525/55 282/522/55 -f 281/526/56 285/527/56 283/519/56 -f 302/528/55 298/529/55 294/530/55 -f 299/531/56 301/532/56 303/533/56 -f 318/534/55 314/535/55 310/536/55 -f 315/537/56 317/538/56 319/539/56 -f 283/519/53 285/527/53 288/520/53 -f 282/522/54 287/525/54 286/523/54 -f 284/521/55 288/520/55 287/525/55 -f 281/526/56 286/540/56 285/527/56 -f 294/530/55 292/541/55 290/542/55 -f 290/542/55 304/543/55 302/528/55 -f 302/528/55 300/544/55 298/529/55 -f 298/529/55 296/545/55 294/530/55 -f 294/530/55 290/542/55 302/528/55 -f 303/533/56 289/546/56 291/547/56 -f 291/547/56 293/548/56 303/533/56 -f 293/548/56 295/549/56 303/533/56 -f 295/549/56 297/550/56 303/533/56 -f 297/550/56 299/531/56 303/533/56 -f 310/536/55 308/551/55 306/552/55 -f 306/552/55 320/553/55 318/534/55 -f 318/534/55 316/554/55 314/535/55 -f 314/535/55 312/555/55 310/536/55 -f 310/536/55 306/552/55 318/534/55 -f 319/539/56 305/556/56 307/557/56 -f 307/557/56 309/558/56 319/539/56 -f 309/558/56 311/559/56 319/539/56 -f 311/559/56 313/560/56 319/539/56 -f 313/560/56 315/537/56 319/539/56 +f 351/635/63 356/636/63 352/637/63 +f 350/638/64 354/639/64 349/640/64 +f 352/637/65 355/641/65 350/638/65 +f 349/642/66 353/643/66 351/635/66 +f 370/644/65 366/645/65 362/646/65 +f 367/647/66 369/648/66 371/649/66 +f 386/650/65 382/651/65 378/652/65 +f 383/653/66 385/654/66 387/655/66 +f 351/635/63 353/643/63 356/636/63 +f 350/638/64 355/641/64 354/639/64 +f 352/637/65 356/636/65 355/641/65 +f 349/642/66 354/656/66 353/643/66 +f 362/646/65 360/657/65 358/658/65 +f 358/658/65 372/659/65 370/644/65 +f 370/644/65 368/660/65 366/645/65 +f 366/645/65 364/661/65 362/646/65 +f 362/646/65 358/658/65 370/644/65 +f 371/649/66 357/662/66 359/663/66 +f 359/663/66 361/664/66 371/649/66 +f 361/664/66 363/665/66 371/649/66 +f 363/665/66 365/666/66 371/649/66 +f 365/666/66 367/647/66 371/649/66 +f 378/652/65 376/667/65 374/668/65 +f 374/668/65 388/669/65 386/650/65 +f 386/650/65 384/670/65 382/651/65 +f 382/651/65 380/671/65 378/652/65 +f 378/652/65 374/668/65 386/650/65 +f 387/655/66 373/672/66 375/673/66 +f 375/673/66 377/674/66 387/655/66 +f 377/674/66 379/675/66 387/655/66 +f 379/675/66 381/676/66 387/655/66 +f 381/676/66 383/653/66 387/655/66 s 1 -f 290/561/57 291/562/58 289/563/57 -f 291/562/58 294/564/54 293/565/54 -f 294/566/54 295/567/59 293/568/54 -f 296/569/59 297/570/60 295/567/59 -f 298/571/60 299/572/61 297/570/60 -f 300/573/61 301/574/53 299/572/61 -f 302/575/53 303/576/62 301/574/53 -f 304/577/62 289/563/57 303/576/62 -f 306/578/57 307/579/58 305/580/57 -f 308/581/58 309/582/54 307/579/58 -f 310/583/54 311/584/59 309/585/54 -f 311/584/59 314/586/60 313/587/60 -f 314/586/60 315/588/61 313/587/60 -f 315/588/61 318/589/53 317/590/53 -f 318/589/53 319/591/62 317/590/53 -f 320/592/62 305/580/57 319/591/62 -f 290/561/57 292/593/58 291/562/58 -f 291/562/58 292/593/58 294/564/54 -f 294/566/54 296/569/59 295/567/59 -f 296/569/59 298/571/60 297/570/60 -f 298/571/60 300/573/61 299/572/61 -f 300/573/61 302/575/53 301/574/53 -f 302/575/53 304/577/62 303/576/62 -f 304/577/62 290/561/57 289/563/57 -f 306/578/57 308/581/58 307/579/58 -f 308/581/58 310/594/54 309/582/54 -f 310/583/54 312/595/59 311/584/59 -f 311/584/59 312/595/59 314/586/60 -f 314/586/60 316/596/61 315/588/61 -f 315/588/61 316/596/61 318/589/53 -f 318/589/53 320/592/62 319/591/62 -f 320/592/62 306/578/57 305/580/57 -o Head2 -v -0.125000 2.750000 0.000000 -v 0.125000 2.750000 0.000000 -v -0.125000 2.750000 -0.250000 -v 0.125000 2.750000 -0.250000 -v -0.125000 1.750000 -0.250000 -v -0.125000 1.750000 0.000000 -v 0.125000 1.750000 0.000000 -v 0.125000 1.750000 -0.250000 -v -0.062500 2.500000 -0.250000 -v 0.062500 2.500000 -0.250000 -v -0.062500 2.500000 -0.437500 -v 0.062500 2.500000 -0.437500 -v -0.062500 2.250000 -0.437500 -v 0.062500 2.250000 -0.437500 -v -0.062500 2.250000 -0.250000 -v 0.062500 2.250000 -0.250000 -v 0.250000 2.625000 -0.093750 -v 0.250000 1.875000 -0.093750 -v 0.250000 2.625000 -0.156250 -v 0.250000 1.875000 -0.156250 -v 0.125000 2.625000 -0.093750 -v 0.125000 1.875000 -0.093750 -v 0.125000 2.625000 -0.156250 -v 0.125000 1.875000 -0.156250 -v 0.187500 2.562500 -0.093750 -v 0.187500 1.937500 -0.093750 -v 0.187500 2.562500 -0.156250 -v 0.187500 1.937500 -0.156250 -v 0.125000 2.562500 -0.093750 -v 0.125000 1.937500 -0.093750 -v 0.125000 2.562500 -0.156250 -v 0.125000 1.937500 -0.156250 -v -0.250001 2.625000 -0.156250 -v -0.250001 1.875000 -0.156250 -v -0.250001 2.625000 -0.093750 -v -0.250001 1.875000 -0.093750 -v -0.125001 2.625000 -0.156250 -v -0.125001 1.875000 -0.156250 -v -0.125001 2.625000 -0.093750 -v -0.125001 1.875000 -0.093750 -v -0.187501 2.562500 -0.156250 -v -0.187501 1.937500 -0.156250 -v -0.187501 2.562500 -0.093750 -v -0.187501 1.937500 -0.093750 -v -0.125001 2.562500 -0.156250 -v -0.125001 1.937500 -0.156250 -v -0.125001 2.562500 -0.093750 -v -0.125001 1.937500 -0.093750 -v -0.125000 2.375000 -0.562500 -v -0.000000 2.375000 -0.562500 -v -0.125000 2.286612 -0.525888 -v -0.000000 2.286612 -0.525888 -v -0.125000 2.250000 -0.437500 -v -0.000000 2.250000 -0.437500 -v -0.125000 2.286612 -0.349112 -v -0.000000 2.286612 -0.349112 -v -0.125000 2.375000 -0.312500 -v -0.000000 2.375000 -0.312500 -v -0.125000 2.463388 -0.349112 -v -0.000000 2.463388 -0.349112 -v -0.125000 2.500000 -0.437500 -v -0.000000 2.500000 -0.437500 -v -0.125000 2.463388 -0.525888 -v -0.000000 2.463388 -0.525888 -vt 0.723684 0.907407 -vt 0.750000 0.870370 -vt 0.750000 0.907407 -vt 0.750000 0.722222 -vt 0.723684 0.685185 -vt 0.750000 0.685185 -vt 0.802632 0.870370 -vt 0.828947 0.722222 -vt 0.828947 0.870370 -vt 0.776316 0.722222 -vt 0.776316 0.870370 -vt 0.723684 0.870370 -vt 0.802632 0.722222 -vt 0.875000 0.574074 -vt 0.861842 0.601852 -vt 0.861842 0.574074 -vt 0.875000 0.601852 -vt 0.901316 0.620370 -vt 0.875000 0.620370 -vt 0.901316 0.601852 -vt 0.914474 0.574074 -vt 0.914474 0.601852 -vt 0.901316 0.574074 -vt 0.940789 0.574074 -vt 0.940789 0.601852 -vt 0.703947 0.703704 -vt 0.710526 0.814815 -vt 0.703947 0.814815 -vt 0.710526 0.685185 -vt 0.710526 0.703704 -vt 0.703947 0.833333 -vt 0.723684 0.805556 -vt 0.717105 0.712963 -vt 0.723684 0.712963 -vt 0.717105 0.685185 -vt 0.723684 0.694444 -vt 0.717105 0.694444 -vt 0.723684 0.833333 -vt 0.717105 0.824074 -vt 0.723684 0.824074 -vt 0.697368 0.824074 -vt 0.710526 0.833333 -vt 0.717105 0.833333 -vt 0.717105 0.805556 -vt 0.697368 0.712963 -vt 0.703947 0.685185 -vt 0.697368 0.694444 -vt 0.697368 0.685185 -vt 0.703947 0.703704 -vt 0.710526 0.814815 -vt 0.703947 0.814815 -vt 0.710526 0.685185 -vt 0.710526 0.703704 -vt 0.703947 0.833333 -vt 0.723684 0.805556 -vt 0.717105 0.712963 -vt 0.723684 0.712963 -vt 0.717105 0.685185 -vt 0.723684 0.694444 -vt 0.717105 0.694444 -vt 0.723684 0.833333 -vt 0.717105 0.824074 -vt 0.723684 0.824074 -vt 0.697368 0.824074 -vt 0.710526 0.833333 -vt 0.717105 0.833333 -vt 0.717105 0.805556 -vt 0.697368 0.712963 -vt 0.703947 0.685185 -vt 0.697368 0.694444 -vt 0.697368 0.685185 -vt 0.723684 0.629566 -vt 0.710572 0.611111 -vt 0.723684 0.592656 -vt 0.706641 0.624161 -vt 0.697369 0.629566 -vt 0.688096 0.624161 -vt 0.723684 0.722222 -vt 0.723684 0.685185 -vt 0.697368 0.833333 -vt 0.697368 0.805556 -vt 0.723684 0.685185 -vt 0.697368 0.833333 -vt 0.697368 0.805556 -vt 0.732956 0.598061 -vt 0.736797 0.611111 -vt 0.732957 0.624161 -vt 0.714412 0.624161 -vt 0.714412 0.598061 -vt 0.684256 0.611111 -vt 0.688096 0.598061 -vt 0.697369 0.592656 -vt 0.706641 0.598061 -vt 0.710481 0.611111 -vt 0.763158 0.574074 -vt 0.776316 0.592593 -vt 0.763158 0.592593 -vt 0.776316 0.574074 -vt 0.789474 0.592593 -vt 0.684211 0.574074 -vt 0.697368 0.592593 -vt 0.684211 0.592593 -vt 0.697368 0.574074 -vt 0.710526 0.592593 -vt 0.710526 0.574074 -vt 0.723684 0.592593 -vt 0.723684 0.574074 -vt 0.736842 0.592593 -vt 0.736842 0.574074 -vt 0.750000 0.592593 -vt 0.750000 0.574074 -vt 0.789474 0.574074 -vn 0.0000 1.0000 0.0000 -vn 0.0000 -1.0000 0.0000 -vn 1.0000 0.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 0.0000 -0.7071 -0.7071 -vn 0.0000 -0.7071 0.7071 -vn 0.0000 0.7071 0.7071 -vn 0.0000 0.7071 -0.7071 -s off -f 322/597/63 323/598/63 321/599/63 -f 325/600/64 327/601/64 326/602/64 -f 322/603/65 328/604/65 324/605/65 -f 323/598/66 326/606/66 321/607/66 -f 324/608/67 325/600/67 323/598/67 -f 321/607/68 327/609/68 322/603/68 -f 330/610/63 331/611/63 329/612/63 -f 332/613/67 333/614/67 331/615/67 -f 334/616/64 335/617/64 333/618/64 -f 336/619/65 332/613/65 330/610/65 -f 333/618/66 329/620/66 331/621/66 -f 338/622/65 339/623/65 337/624/65 -f 338/622/64 344/625/64 340/626/64 -f 339/623/63 341/627/63 337/624/63 -f 345/628/66 348/629/66 346/630/66 -f 352/631/63 346/632/63 348/633/63 -f 349/634/64 347/635/64 345/636/64 -f 341/627/68 345/637/68 337/624/68 -f 343/638/67 347/635/67 351/639/67 -f 340/626/67 347/640/67 339/623/67 -f 344/625/67 348/633/67 340/626/67 -f 337/624/68 346/641/68 338/622/68 -f 342/642/68 346/643/68 350/644/68 -f 354/645/66 355/646/66 353/647/66 -f 354/645/64 360/648/64 356/649/64 -f 355/646/63 357/650/63 353/647/63 -f 361/651/65 364/652/65 362/653/65 -f 368/654/63 362/655/63 364/656/63 -f 365/657/64 363/658/64 361/659/64 -f 357/650/67 361/660/67 353/647/67 -f 359/661/68 363/658/68 367/662/68 -f 356/649/68 363/663/68 355/646/68 -f 360/648/68 364/656/68 356/649/68 -f 353/647/67 362/664/67 354/645/67 -f 358/665/67 362/666/67 366/667/67 -f 382/668/65 378/669/65 374/670/65 -f 379/671/66 381/672/66 383/673/66 -f 322/597/63 324/608/63 323/598/63 -f 325/600/64 328/674/64 327/601/64 -f 322/603/65 327/609/65 328/604/65 -f 323/598/66 325/600/66 326/606/66 -f 324/608/67 328/674/67 325/600/67 -f 321/607/68 326/606/68 327/609/68 -f 330/610/63 332/613/63 331/611/63 -f 332/613/67 334/616/67 333/614/67 -f 334/616/64 336/619/64 335/617/64 -f 336/619/65 334/616/65 332/613/65 -f 333/618/66 335/617/66 329/620/66 -f 338/622/65 340/626/65 339/623/65 -f 338/622/64 342/642/64 344/625/64 -f 339/623/63 343/638/63 341/627/63 -f 345/628/66 347/640/66 348/629/66 -f 352/631/63 350/675/63 346/632/63 -f 349/634/64 351/639/64 347/635/64 -f 341/627/68 349/676/68 345/637/68 -f 343/638/67 339/623/67 347/635/67 -f 340/626/67 348/629/67 347/640/67 -f 344/625/67 352/631/67 348/633/67 -f 337/624/68 345/677/68 346/641/68 -f 342/642/68 338/622/68 346/643/68 -f 354/645/66 356/649/66 355/646/66 -f 354/645/64 358/665/64 360/648/64 -f 355/646/63 359/661/63 357/650/63 -f 361/651/65 363/663/65 364/652/65 -f 368/654/63 366/678/63 362/655/63 -f 365/657/64 367/662/64 363/658/64 -f 357/650/67 365/679/67 361/660/67 -f 359/661/68 355/646/68 363/658/68 -f 356/649/68 364/652/68 363/663/68 -f 360/648/68 368/654/68 364/656/68 -f 353/647/67 361/680/67 362/664/67 -f 358/665/67 354/645/67 362/666/67 -f 374/670/65 372/681/65 370/682/65 -f 370/682/65 384/683/65 382/668/65 -f 382/668/65 380/684/65 378/669/65 -f 378/669/65 376/685/65 374/670/65 -f 374/670/65 370/682/65 382/668/65 -f 383/673/66 369/686/66 371/687/66 -f 371/687/66 373/688/66 383/673/66 -f 373/688/66 375/689/66 383/673/66 -f 375/689/66 377/690/66 383/673/66 -f 377/690/66 379/671/66 383/673/66 -s 1 -f 370/691/67 371/692/69 369/693/67 -f 372/694/69 373/695/64 371/692/69 -f 374/696/64 375/697/70 373/698/64 -f 376/699/70 377/700/68 375/697/70 -f 378/701/68 379/702/71 377/700/68 -f 380/703/71 381/704/63 379/702/71 -f 382/705/63 383/706/72 381/704/63 -f 384/707/72 369/693/67 383/706/72 -f 370/691/67 372/694/69 371/692/69 -f 372/694/69 374/708/64 373/695/64 -f 374/696/64 376/699/70 375/697/70 -f 376/699/70 378/701/68 377/700/68 -f 378/701/68 380/703/71 379/702/71 -f 380/703/71 382/705/63 381/704/63 -f 382/705/63 384/707/72 383/706/72 -f 384/707/72 370/691/67 369/693/67 +f 358/677/67 359/678/68 357/679/67 +f 359/678/68 362/680/64 361/681/64 +f 362/682/64 363/683/69 361/684/64 +f 364/685/69 365/686/70 363/683/69 +f 366/687/70 367/688/71 365/686/70 +f 368/689/71 369/690/63 367/688/71 +f 370/691/63 371/692/72 369/690/63 +f 372/693/72 357/679/67 371/692/72 +f 374/694/67 375/695/68 373/696/67 +f 376/697/68 377/698/64 375/695/68 +f 378/699/64 379/700/69 377/701/64 +f 379/700/69 382/702/70 381/703/70 +f 382/702/70 383/704/71 381/703/70 +f 383/704/71 386/705/63 385/706/63 +f 386/705/63 387/707/72 385/706/63 +f 388/708/72 373/696/67 387/707/72 +f 358/677/67 360/709/68 359/678/68 +f 359/678/68 360/709/68 362/680/64 +f 362/682/64 364/685/69 363/683/69 +f 364/685/69 366/687/70 365/686/70 +f 366/687/70 368/689/71 367/688/71 +f 368/689/71 370/691/63 369/690/63 +f 370/691/63 372/693/72 371/692/72 +f 372/693/72 358/677/67 357/679/67 +f 374/694/67 376/697/68 375/695/68 +f 376/697/68 378/710/64 377/698/64 +f 378/699/64 380/711/69 379/700/69 +f 379/700/69 380/711/69 382/702/70 +f 382/702/70 384/712/71 383/704/71 +f 383/704/71 384/712/71 386/705/63 +f 386/705/63 388/708/72 387/707/72 +f 388/708/72 374/694/67 373/696/67 o Head1 v 0.125000 2.750000 -0.000000 v -0.125000 2.750000 0.000000 @@ -1893,6 +1903,10 @@ v 0.125000 2.500000 0.437500 v 0.000000 2.500000 0.437500 v 0.125000 2.463388 0.525888 v 0.000000 2.463388 0.525888 +v 0.130000 1.875000 0.234375 +v 0.130000 1.875000 0.171875 +v 0.130000 2.062500 0.234375 +v 0.130000 2.062500 0.171875 vt 0.750000 0.907407 vt 0.723684 0.870370 vt 0.750000 0.870370 @@ -1970,6 +1984,9 @@ vt 0.723684 0.592656 vt 0.706641 0.624161 vt 0.697369 0.629566 vt 0.688096 0.624161 +vt 0.559211 1.000000 +vt 0.460526 0.953704 +vt 0.559211 0.953704 vt 0.723684 0.907407 vt 0.717105 0.685185 vt 0.697368 0.833333 @@ -1987,6 +2004,7 @@ vt 0.688096 0.598061 vt 0.697369 0.592656 vt 0.706641 0.598061 vt 0.710481 0.611111 +vt 0.460526 1.000000 vt 0.763158 0.574074 vt 0.776316 0.592593 vt 0.763158 0.592593 @@ -2016,105 +2034,107 @@ vn 0.0000 -0.7071 -0.7071 vn 0.0000 0.7071 -0.7071 vn 0.0000 0.7071 0.7071 s off -f 385/709/73 388/710/73 387/711/73 -f 390/712/74 392/713/74 391/714/74 -f 386/715/75 392/716/75 388/717/75 -f 387/711/76 390/718/76 385/719/76 -f 388/710/77 389/720/77 387/711/77 -f 385/719/78 391/721/78 386/715/78 -f 394/722/73 395/723/73 393/724/73 -f 396/725/77 397/726/77 395/727/77 -f 398/728/74 399/729/74 397/730/74 -f 400/731/75 396/725/75 394/722/75 -f 397/730/76 393/732/76 395/733/76 -f 402/734/75 403/735/75 401/736/75 -f 402/734/74 408/737/74 404/738/74 -f 403/735/73 405/739/73 401/736/73 -f 409/740/76 412/741/76 410/742/76 -f 412/743/73 414/744/73 410/745/73 -f 413/746/74 411/747/74 409/748/74 -f 405/739/78 409/749/78 401/736/78 -f 407/750/77 411/747/77 415/751/77 -f 404/738/77 411/752/77 403/735/77 -f 408/737/77 412/743/77 404/738/77 -f 401/736/78 410/753/78 402/734/78 -f 406/754/78 410/755/78 414/756/78 -f 418/757/76 419/758/76 417/759/76 -f 418/757/74 424/760/74 420/761/74 -f 417/759/73 423/762/73 421/763/73 -f 425/764/75 428/765/75 426/766/75 -f 432/767/73 426/768/73 428/769/73 -f 429/770/74 427/771/74 425/772/74 -f 421/763/77 425/773/77 417/759/77 -f 423/762/78 427/771/78 431/774/78 -f 420/761/78 427/775/78 419/758/78 -f 424/760/78 428/769/78 420/761/78 -f 417/759/77 426/776/77 418/757/77 -f 422/777/77 426/778/77 430/779/77 -f 446/780/75 442/781/75 438/782/75 -f 443/783/76 445/784/76 447/785/76 -f 385/709/73 386/786/73 388/710/73 -f 390/712/74 389/720/74 392/713/74 -f 386/715/75 391/721/75 392/716/75 -f 387/711/76 389/720/76 390/718/76 -f 388/710/77 392/713/77 389/720/77 -f 385/719/78 390/718/78 391/721/78 -f 394/722/73 396/725/73 395/723/73 -f 396/725/77 398/728/77 397/726/77 -f 398/728/74 400/731/74 399/729/74 -f 400/731/75 398/728/75 396/725/75 -f 397/730/76 399/729/76 393/732/76 -f 402/734/75 404/738/75 403/735/75 -f 402/734/74 406/754/74 408/737/74 -f 403/735/73 407/750/73 405/739/73 -f 409/740/76 411/752/76 412/741/76 -f 412/743/73 416/787/73 414/744/73 -f 413/746/74 415/751/74 411/747/74 -f 405/739/78 413/788/78 409/749/78 -f 407/750/77 403/735/77 411/747/77 -f 404/738/77 412/741/77 411/752/77 -f 408/737/77 416/787/77 412/743/77 -f 401/736/78 409/789/78 410/753/78 -f 406/754/78 402/734/78 410/755/78 -f 418/757/76 420/761/76 419/758/76 -f 418/757/74 422/777/74 424/760/74 -f 417/759/73 419/758/73 423/762/73 -f 425/764/75 427/775/75 428/765/75 -f 432/767/73 430/790/73 426/768/73 -f 429/770/74 431/774/74 427/771/74 -f 421/763/77 429/791/77 425/773/77 -f 423/762/78 419/758/78 427/771/78 -f 420/761/78 428/765/78 427/775/78 -f 424/760/78 432/767/78 428/769/78 -f 417/759/77 425/792/77 426/776/77 -f 422/777/77 418/757/77 426/778/77 -f 438/782/75 436/793/75 434/794/75 -f 434/794/75 448/795/75 446/780/75 -f 446/780/75 444/796/75 442/781/75 -f 442/781/75 440/797/75 438/782/75 -f 438/782/75 434/794/75 446/780/75 -f 447/785/76 433/798/76 435/799/76 -f 435/799/76 437/800/76 447/785/76 -f 437/800/76 439/801/76 447/785/76 -f 439/801/76 441/802/76 447/785/76 -f 441/802/76 443/783/76 447/785/76 +f 389/713/73 392/714/73 391/715/73 +f 394/716/74 396/717/74 395/718/74 +f 390/719/75 396/720/75 392/721/75 +f 391/715/76 394/722/76 389/723/76 +f 392/714/77 393/724/77 391/715/77 +f 389/723/78 395/725/78 390/719/78 +f 398/726/73 399/727/73 397/728/73 +f 400/729/77 401/730/77 399/731/77 +f 402/732/74 403/733/74 401/734/74 +f 404/735/75 400/729/75 398/726/75 +f 401/734/76 397/736/76 399/737/76 +f 406/738/75 407/739/75 405/740/75 +f 406/738/74 412/741/74 408/742/74 +f 407/739/73 409/743/73 405/740/73 +f 413/744/76 416/745/76 414/746/76 +f 416/747/73 418/748/73 414/749/73 +f 417/750/74 415/751/74 413/752/74 +f 409/743/78 413/753/78 405/740/78 +f 411/754/77 415/751/77 419/755/77 +f 408/742/77 415/756/77 407/739/77 +f 412/741/77 416/747/77 408/742/77 +f 405/740/78 414/757/78 406/738/78 +f 410/758/78 414/759/78 418/760/78 +f 422/761/76 423/762/76 421/763/76 +f 422/761/74 428/764/74 424/765/74 +f 421/763/73 427/766/73 425/767/73 +f 429/768/75 432/769/75 430/770/75 +f 436/771/73 430/772/73 432/773/73 +f 433/774/74 431/775/74 429/776/74 +f 425/767/77 429/777/77 421/763/77 +f 427/766/78 431/775/78 435/778/78 +f 424/765/78 431/779/78 423/762/78 +f 428/764/78 432/773/78 424/765/78 +f 421/763/77 430/780/77 422/761/77 +f 426/781/77 430/782/77 434/783/77 +f 450/784/75 446/785/75 442/786/75 +f 447/787/76 449/788/76 451/789/76 +f 454/790/76 455/791/76 453/792/76 +f 389/713/73 390/793/73 392/714/73 +f 394/716/74 393/724/74 396/717/74 +f 390/719/75 395/725/75 396/720/75 +f 391/715/76 393/724/76 394/722/76 +f 392/714/77 396/717/77 393/724/77 +f 389/723/78 394/722/78 395/725/78 +f 398/726/73 400/729/73 399/727/73 +f 400/729/77 402/732/77 401/730/77 +f 402/732/74 404/735/74 403/733/74 +f 404/735/75 402/732/75 400/729/75 +f 401/734/76 403/733/76 397/736/76 +f 406/738/75 408/742/75 407/739/75 +f 406/738/74 410/758/74 412/741/74 +f 407/739/73 411/754/73 409/743/73 +f 413/744/76 415/756/76 416/745/76 +f 416/747/73 420/794/73 418/748/73 +f 417/750/74 419/755/74 415/751/74 +f 409/743/78 417/795/78 413/753/78 +f 411/754/77 407/739/77 415/751/77 +f 408/742/77 416/745/77 415/756/77 +f 412/741/77 420/794/77 416/747/77 +f 405/740/78 413/796/78 414/757/78 +f 410/758/78 406/738/78 414/759/78 +f 422/761/76 424/765/76 423/762/76 +f 422/761/74 426/781/74 428/764/74 +f 421/763/73 423/762/73 427/766/73 +f 429/768/75 431/779/75 432/769/75 +f 436/771/73 434/797/73 430/772/73 +f 433/774/74 435/778/74 431/775/74 +f 425/767/77 433/798/77 429/777/77 +f 427/766/78 423/762/78 431/775/78 +f 424/765/78 432/769/78 431/779/78 +f 428/764/78 436/771/78 432/773/78 +f 421/763/77 429/799/77 430/780/77 +f 426/781/77 422/761/77 430/782/77 +f 442/786/75 440/800/75 438/801/75 +f 438/801/75 452/802/75 450/784/75 +f 450/784/75 448/803/75 446/785/75 +f 446/785/75 444/804/75 442/786/75 +f 442/786/75 438/801/75 450/784/75 +f 451/789/76 437/805/76 439/806/76 +f 439/806/76 441/807/76 451/789/76 +f 441/807/76 443/808/76 451/789/76 +f 443/808/76 445/809/76 451/789/76 +f 445/809/76 447/787/76 451/789/76 +f 454/790/76 456/810/76 455/791/76 s 1 -f 434/803/77 435/804/79 433/805/77 -f 436/806/79 437/807/74 435/804/79 -f 438/808/74 439/809/80 437/810/74 -f 440/811/80 441/812/78 439/809/80 -f 442/813/78 443/814/81 441/812/78 -f 444/815/81 445/816/73 443/814/81 -f 446/817/73 447/818/82 445/816/73 -f 448/819/82 433/805/77 447/818/82 -f 434/803/77 436/806/79 435/804/79 -f 436/806/79 438/820/74 437/807/74 -f 438/808/74 440/811/80 439/809/80 -f 440/811/80 442/813/78 441/812/78 -f 442/813/78 444/815/81 443/814/81 -f 444/815/81 446/817/73 445/816/73 -f 446/817/73 448/819/82 447/818/82 -f 448/819/82 434/803/77 433/805/77 +f 438/811/77 439/812/79 437/813/77 +f 440/814/79 441/815/74 439/812/79 +f 442/816/74 443/817/80 441/818/74 +f 444/819/80 445/820/78 443/817/80 +f 446/821/78 447/822/81 445/820/78 +f 448/823/81 449/824/73 447/822/81 +f 450/825/73 451/826/82 449/824/73 +f 452/827/82 437/813/77 451/826/82 +f 438/811/77 440/814/79 439/812/79 +f 440/814/79 442/828/74 441/815/74 +f 442/816/74 444/819/80 443/817/80 +f 444/819/80 446/821/78 445/820/78 +f 446/821/78 448/823/81 447/822/81 +f 448/823/81 450/825/73 449/824/73 +f 450/825/73 452/827/82 451/826/82 +f 452/827/82 438/811/77 437/813/77 o Spike2 v -0.062500 2.875000 -0.062500 v 0.062500 2.875000 -0.062500 @@ -2151,20 +2171,20 @@ vn 0.0000 -0.2425 -0.9701 vn 0.9701 -0.2425 0.0000 vn 0.0000 -0.2425 0.9701 s off -f 450/821/83 451/822/83 449/823/83 -f 450/824/84 456/825/84 452/826/84 -f 451/822/85 454/827/85 449/828/85 -f 452/829/86 453/830/86 451/822/86 -f 449/828/87 455/831/87 450/824/87 -f 454/827/88 453/830/88 457/832/88 -f 453/830/89 456/833/89 457/834/89 -f 456/825/90 455/831/90 457/835/90 -f 455/831/91 454/827/91 457/836/91 -f 450/821/83 452/829/83 451/822/83 -f 450/824/84 455/831/84 456/825/84 -f 451/822/85 453/830/85 454/827/85 -f 452/829/86 456/833/86 453/830/86 -f 449/828/87 454/827/87 455/831/87 +f 458/829/83 459/830/83 457/831/83 +f 458/832/84 464/833/84 460/834/84 +f 459/830/85 462/835/85 457/836/85 +f 460/837/86 461/838/86 459/830/86 +f 457/836/87 463/839/87 458/832/87 +f 462/835/88 461/838/88 465/840/88 +f 461/838/89 464/841/89 465/842/89 +f 464/833/90 463/839/90 465/843/90 +f 463/839/91 462/835/91 465/844/91 +f 458/829/83 460/837/83 459/830/83 +f 458/832/84 463/839/84 464/833/84 +f 459/830/85 461/838/85 462/835/85 +f 460/837/86 464/841/86 461/838/86 +f 457/836/87 462/835/87 463/839/87 o Spike1 v 0.062500 2.875000 0.062500 v -0.062500 2.875000 0.062500 @@ -2201,20 +2221,20 @@ vn 0.0000 -0.2425 0.9701 vn -0.9701 -0.2425 0.0000 vn 0.0000 -0.2425 -0.9701 s off -f 458/837/92 461/838/92 460/839/92 -f 459/840/93 465/841/93 461/842/93 -f 460/839/94 463/843/94 458/844/94 -f 461/838/95 462/845/95 460/839/95 -f 458/844/96 464/846/96 459/840/96 -f 463/843/97 462/845/97 466/847/97 -f 462/845/98 465/848/98 466/849/98 -f 465/841/99 464/846/99 466/850/99 -f 464/846/100 463/843/100 466/851/100 -f 458/837/92 459/852/92 461/838/92 -f 459/840/93 464/846/93 465/841/93 -f 460/839/94 462/845/94 463/843/94 -f 461/838/95 465/848/95 462/845/95 -f 458/844/96 463/843/96 464/846/96 +f 466/845/92 469/846/92 468/847/92 +f 467/848/93 473/849/93 469/850/93 +f 468/847/94 471/851/94 466/852/94 +f 469/846/95 470/853/95 468/847/95 +f 466/852/96 472/854/96 467/848/96 +f 471/851/97 470/853/97 474/855/97 +f 470/853/98 473/856/98 474/857/98 +f 473/849/99 472/854/99 474/858/99 +f 472/854/100 471/851/100 474/859/100 +f 466/845/92 467/860/92 469/846/92 +f 467/848/93 472/854/93 473/849/93 +f 468/847/94 470/853/94 471/851/94 +f 469/846/95 473/856/95 470/853/95 +f 466/852/96 471/851/96 472/854/96 o Frame v 1.250000 2.750000 -1.250000 v 1.250000 3.000000 -1.250000 @@ -2455,118 +2475,118 @@ vn 0.0000 0.0000 1.0000 vn 0.0000 -1.0000 0.0000 vn 0.0000 1.0000 0.0000 s off -f 468/853/101 469/854/101 467/855/101 -f 470/856/102 473/857/102 469/854/102 -f 474/858/103 471/859/103 473/857/103 -f 472/860/104 467/855/104 471/861/104 -f 473/857/105 467/862/105 469/863/105 -f 470/864/106 472/865/106 474/858/106 -f 476/866/101 477/867/101 475/868/101 -f 478/869/102 481/870/102 477/867/102 -f 482/871/103 479/872/103 481/870/103 -f 480/873/104 475/868/104 479/874/104 -f 481/870/105 475/875/105 477/876/105 -f 478/877/106 480/878/106 482/871/106 -f 484/879/101 485/880/101 483/881/101 -f 486/882/102 489/883/102 485/880/102 -f 490/884/103 487/885/103 489/883/103 -f 488/886/104 483/881/104 487/887/104 -f 489/883/105 483/888/105 485/889/105 -f 486/890/106 488/891/106 490/884/106 -f 492/892/101 493/893/101 491/894/101 -f 494/895/102 497/896/102 493/893/102 -f 498/897/103 495/898/103 497/896/103 -f 496/899/104 491/894/104 495/900/104 -f 497/896/105 491/901/105 493/902/105 -f 494/903/106 496/904/106 498/897/106 -f 502/905/103 500/906/103 501/907/103 -f 501/907/105 506/908/105 502/905/105 -f 499/909/106 504/910/106 500/906/106 -f 506/911/101 504/910/101 503/912/101 +f 476/861/101 477/862/101 475/863/101 +f 478/864/102 481/865/102 477/862/102 +f 482/866/103 479/867/103 481/865/103 +f 480/868/104 475/863/104 479/869/104 +f 481/865/105 475/870/105 477/871/105 +f 478/872/106 480/873/106 482/866/106 +f 484/874/101 485/875/101 483/876/101 +f 486/877/102 489/878/102 485/875/102 +f 490/879/103 487/880/103 489/878/103 +f 488/881/104 483/876/104 487/882/104 +f 489/878/105 483/883/105 485/884/105 +f 486/885/106 488/886/106 490/879/106 +f 492/887/101 493/888/101 491/889/101 +f 494/890/102 497/891/102 493/888/102 +f 498/892/103 495/893/103 497/891/103 +f 496/894/104 491/889/104 495/895/104 +f 497/891/105 491/896/105 493/897/105 +f 494/898/106 496/899/106 498/892/106 +f 500/900/101 501/901/101 499/902/101 +f 502/903/102 505/904/102 501/901/102 +f 506/905/103 503/906/103 505/904/103 +f 504/907/104 499/902/104 503/908/104 +f 505/904/105 499/909/105 501/910/105 +f 502/911/106 504/912/106 506/905/106 f 510/913/103 508/914/103 509/915/103 -f 509/916/105 514/917/105 510/918/105 -f 507/919/106 512/920/106 508/914/106 -f 514/917/101 512/920/101 511/921/101 -f 518/922/102 516/923/102 517/924/102 -f 517/924/105 522/925/105 518/922/105 -f 515/926/106 520/927/106 516/923/106 -f 522/928/104 520/927/104 519/929/104 +f 509/915/105 514/916/105 510/913/105 +f 507/917/106 512/918/106 508/914/106 +f 514/919/101 512/918/101 511/920/101 +f 518/921/103 516/922/103 517/923/103 +f 517/924/105 522/925/105 518/926/105 +f 515/927/106 520/928/106 516/922/106 +f 522/925/101 520/928/101 519/929/101 f 526/930/102 524/931/102 525/932/102 -f 525/933/105 530/934/105 526/935/105 -f 523/936/106 528/937/106 524/931/106 -f 530/934/104 528/937/104 527/938/104 -f 534/939/102 532/940/102 533/941/102 -f 533/941/101 538/942/101 534/939/101 -f 531/943/103 536/944/103 532/940/103 +f 525/932/105 530/933/105 526/930/105 +f 523/934/106 528/935/106 524/931/106 +f 530/936/104 528/935/104 527/937/104 +f 534/938/102 532/939/102 533/940/102 +f 533/941/105 538/942/105 534/943/105 +f 531/944/106 536/945/106 532/939/106 f 538/942/104 536/945/104 535/946/104 f 542/947/102 540/948/102 541/949/102 f 541/949/101 546/950/101 542/947/101 -f 539/951/103 544/952/103 540/953/103 -f 546/950/104 544/952/104 543/954/104 +f 539/951/103 544/952/103 540/948/103 +f 546/950/104 544/953/104 543/954/104 f 550/955/102 548/956/102 549/957/102 f 549/957/101 554/958/101 550/955/101 -f 547/959/103 552/960/103 548/956/103 -f 554/961/104 552/960/104 551/962/104 +f 547/959/103 552/960/103 548/961/103 +f 554/958/104 552/960/104 551/962/104 f 558/963/102 556/964/102 557/965/102 -f 557/966/101 562/967/101 558/968/101 -f 555/969/103 560/970/103 556/964/103 -f 562/967/104 560/970/104 559/971/104 -f 468/853/101 470/856/101 469/854/101 -f 470/856/102 474/858/102 473/857/102 -f 474/858/103 472/865/103 471/859/103 -f 472/860/104 468/853/104 467/855/104 -f 473/857/105 471/859/105 467/862/105 -f 470/864/106 468/972/106 472/865/106 -f 476/866/101 478/869/101 477/867/101 -f 478/869/102 482/871/102 481/870/102 -f 482/871/103 480/878/103 479/872/103 -f 480/873/104 476/866/104 475/868/104 -f 481/870/105 479/872/105 475/875/105 -f 478/877/106 476/973/106 480/878/106 -f 484/879/101 486/882/101 485/880/101 -f 486/882/102 490/884/102 489/883/102 -f 490/884/103 488/891/103 487/885/103 -f 488/886/104 484/879/104 483/881/104 -f 489/883/105 487/885/105 483/888/105 -f 486/890/106 484/974/106 488/891/106 -f 492/892/101 494/895/101 493/893/101 -f 494/895/102 498/897/102 497/896/102 -f 498/897/103 496/904/103 495/898/103 -f 496/899/104 492/892/104 491/894/104 -f 497/896/105 495/898/105 491/901/105 -f 494/903/106 492/975/106 496/904/106 -f 502/905/103 499/909/103 500/906/103 -f 501/907/105 505/976/105 506/908/105 -f 499/909/106 503/912/106 504/910/106 -f 506/911/101 505/977/101 504/910/101 -f 510/913/103 507/919/103 508/914/103 -f 509/916/105 513/978/105 514/917/105 -f 507/919/106 511/921/106 512/920/106 -f 514/917/101 513/978/101 512/920/101 -f 518/922/102 515/926/102 516/923/102 -f 517/924/105 521/979/105 522/925/105 -f 515/926/106 519/929/106 520/927/106 -f 522/928/104 521/980/104 520/927/104 -f 526/930/102 523/936/102 524/931/102 -f 525/933/105 529/981/105 530/934/105 -f 523/936/106 527/938/106 528/937/106 -f 530/934/104 529/981/104 528/937/104 -f 534/939/102 531/943/102 532/940/102 -f 533/941/101 537/982/101 538/942/101 -f 531/943/103 535/983/103 536/944/103 -f 538/942/104 537/982/104 536/945/104 -f 542/947/102 539/984/102 540/948/102 -f 541/949/101 545/985/101 546/950/101 -f 539/951/103 543/954/103 544/952/103 -f 546/950/104 545/985/104 544/952/104 -f 550/955/102 547/959/102 548/956/102 -f 549/957/101 553/986/101 554/958/101 +f 557/965/101 562/966/101 558/963/101 +f 555/967/103 560/968/103 556/964/103 +f 562/969/104 560/968/104 559/970/104 +f 566/971/102 564/972/102 565/973/102 +f 565/974/101 570/975/101 566/976/101 +f 563/977/103 568/978/103 564/972/103 +f 570/975/104 568/978/104 567/979/104 +f 476/861/101 478/864/101 477/862/101 +f 478/864/102 482/866/102 481/865/102 +f 482/866/103 480/873/103 479/867/103 +f 480/868/104 476/861/104 475/863/104 +f 481/865/105 479/867/105 475/870/105 +f 478/872/106 476/980/106 480/873/106 +f 484/874/101 486/877/101 485/875/101 +f 486/877/102 490/879/102 489/878/102 +f 490/879/103 488/886/103 487/880/103 +f 488/881/104 484/874/104 483/876/104 +f 489/878/105 487/880/105 483/883/105 +f 486/885/106 484/981/106 488/886/106 +f 492/887/101 494/890/101 493/888/101 +f 494/890/102 498/892/102 497/891/102 +f 498/892/103 496/899/103 495/893/103 +f 496/894/104 492/887/104 491/889/104 +f 497/891/105 495/893/105 491/896/105 +f 494/898/106 492/982/106 496/899/106 +f 500/900/101 502/903/101 501/901/101 +f 502/903/102 506/905/102 505/904/102 +f 506/905/103 504/912/103 503/906/103 +f 504/907/104 500/900/104 499/902/104 +f 505/904/105 503/906/105 499/909/105 +f 502/911/106 500/983/106 504/912/106 +f 510/913/103 507/917/103 508/914/103 +f 509/915/105 513/984/105 514/916/105 +f 507/917/106 511/920/106 512/918/106 +f 514/919/101 513/985/101 512/918/101 +f 518/921/103 515/927/103 516/922/103 +f 517/924/105 521/986/105 522/925/105 +f 515/927/106 519/929/106 520/928/106 +f 522/925/101 521/986/101 520/928/101 +f 526/930/102 523/934/102 524/931/102 +f 525/932/105 529/987/105 530/933/105 +f 523/934/106 527/937/106 528/935/106 +f 530/936/104 529/988/104 528/935/104 +f 534/938/102 531/944/102 532/939/102 +f 533/941/105 537/989/105 538/942/105 +f 531/944/106 535/946/106 536/945/106 +f 538/942/104 537/989/104 536/945/104 +f 542/947/102 539/951/102 540/948/102 +f 541/949/101 545/990/101 546/950/101 +f 539/951/103 543/991/103 544/952/103 +f 546/950/104 545/990/104 544/953/104 +f 550/955/102 547/992/102 548/956/102 +f 549/957/101 553/993/101 554/958/101 f 547/959/103 551/962/103 552/960/103 -f 554/961/104 553/987/104 552/960/104 -f 558/963/102 555/969/102 556/964/102 -f 557/966/101 561/988/101 562/967/101 -f 555/969/103 559/971/103 560/970/103 -f 562/967/104 561/988/104 560/970/104 +f 554/958/104 553/993/104 552/960/104 +f 558/963/102 555/967/102 556/964/102 +f 557/965/101 561/994/101 562/966/101 +f 555/967/103 559/970/103 560/968/103 +f 562/969/104 561/995/104 560/968/104 +f 566/971/102 563/977/102 564/972/102 +f 565/974/101 569/996/101 570/975/101 +f 563/977/103 567/979/103 568/978/103 +f 570/975/104 569/996/104 568/978/104 o Base v 1.500000 0.125000 -1.250000 v 1.500000 0.125000 1.250000 @@ -3233,78 +3253,78 @@ vt 0.052632 0.296296 vt 0.210526 0.296296 vt 0.052632 0.518519 vt 0.263158 0.074074 -vt 0.315789 0.111111 -vt 0.269737 0.111111 +vt 0.312500 0.111111 +vt 0.266447 0.111111 vt 0.210526 0.074074 -vt 0.263158 0.111111 -vt 0.217105 0.111111 +vt 0.259868 0.111111 +vt 0.213816 0.111111 vt 0.157895 0.074074 -vt 0.210526 0.111111 -vt 0.164474 0.111111 +vt 0.207237 0.111111 +vt 0.161184 0.111111 vt 0.105263 0.074074 -vt 0.157895 0.111111 -vt 0.111842 0.111111 +vt 0.154605 0.111111 +vt 0.108553 0.111111 vt 0.052632 0.074074 -vt 0.105263 0.111111 -vt 0.059211 0.111111 +vt 0.101974 0.111111 +vt 0.055921 0.111111 vt -0.000000 0.074074 -vt 0.052632 0.111111 -vt 0.006579 0.111111 +vt 0.049342 0.111111 +vt 0.003289 0.111111 vt 0.842105 0.074074 -vt 0.796053 0.111111 +vt 0.792763 0.111111 vt 0.789474 0.074074 -vt 0.743421 0.111111 +vt 0.740132 0.111111 vt 0.736842 0.074074 -vt 0.690789 0.111111 +vt 0.687500 0.111111 vt 0.684211 0.074074 -vt 0.638158 0.111111 +vt 0.634869 0.111111 vt 0.631579 0.074074 -vt 0.585526 0.111111 +vt 0.582237 0.111111 vt 0.578947 0.074074 -vt 0.532895 0.111111 +vt 0.529605 0.111111 vt 0.526316 0.074074 -vt 0.480263 0.111111 +vt 0.476974 0.111111 vt 0.473684 0.074074 -vt 0.427632 0.111111 +vt 0.424342 0.111111 vt 0.421053 0.074074 -vt 0.375000 0.111111 +vt 0.371711 0.111111 vt 0.368421 0.074074 vt 0.315789 0.074074 -vt 0.368421 0.111111 -vt 0.322368 0.111111 +vt 0.365132 0.111111 +vt 0.319079 0.111111 vt 0.263158 0.037037 -vt 0.315789 0.000000 +vt 0.312500 0.000000 vt 0.315789 0.037037 vt 0.210526 0.037037 -vt 0.263158 0.000000 +vt 0.259868 0.000000 vt 0.157895 0.037037 -vt 0.210526 0.000000 +vt 0.207237 0.000000 vt 0.105263 0.037037 -vt 0.157895 0.000000 +vt 0.154605 0.000000 vt 0.052632 0.037037 -vt 0.105263 0.000000 +vt 0.101974 0.000000 vt -0.000000 0.037037 -vt 0.052632 0.000000 -vt 0.802632 0.000000 +vt 0.049342 0.000000 +vt 0.799342 0.000000 vt 0.842105 0.037037 vt 0.789474 0.037037 -vt 0.750000 0.000000 +vt 0.746711 0.000000 vt 0.736842 0.037037 -vt 0.697368 0.000000 +vt 0.694079 0.000000 vt 0.684211 0.037037 -vt 0.644737 0.000000 +vt 0.641447 0.000000 vt 0.631579 0.037037 -vt 0.592105 0.000000 +vt 0.588816 0.000000 vt 0.578947 0.037037 -vt 0.539474 0.000000 +vt 0.536184 0.000000 vt 0.526316 0.037037 -vt 0.480263 0.000000 +vt 0.476974 0.000000 vt 0.473684 0.037037 -vt 0.427632 0.000000 +vt 0.424342 0.000000 vt 0.421053 0.037037 -vt 0.375000 0.000000 +vt 0.371711 0.000000 vt 0.368421 0.037037 -vt 0.368421 0.000000 +vt 0.365132 0.000000 vt 0.578947 0.722222 vt 0.657895 0.833333 vt 0.578947 0.833333 @@ -3739,31 +3759,31 @@ vt 0.263158 0.740741 vt 0.368421 0.296296 vt 0.526316 0.592593 vt 0.052632 0.888889 -vt 0.842105 0.111111 -vt 0.789474 0.111111 -vt 0.736842 0.111111 -vt 0.684211 0.111111 -vt 0.631579 0.111111 -vt 0.578947 0.111111 -vt 0.526316 0.111111 -vt 0.473684 0.111111 -vt 0.421053 0.111111 -vt 0.269737 0.000000 -vt 0.217105 0.000000 -vt 0.164474 0.000000 -vt 0.111842 0.000000 -vt 0.059211 0.000000 -vt 0.006579 0.000000 -vt 0.842105 0.000000 -vt 0.789474 0.000000 -vt 0.736842 0.000000 -vt 0.684211 0.000000 -vt 0.631579 0.000000 -vt 0.578947 0.000000 -vt 0.526316 0.000000 -vt 0.473684 0.000000 -vt 0.421053 0.000000 -vt 0.322368 0.000000 +vt 0.838816 0.111111 +vt 0.786184 0.111111 +vt 0.733553 0.111111 +vt 0.680921 0.111111 +vt 0.628289 0.111111 +vt 0.575658 0.111111 +vt 0.523026 0.111111 +vt 0.470395 0.111111 +vt 0.417763 0.111111 +vt 0.266447 0.000000 +vt 0.213816 0.000000 +vt 0.161184 0.000000 +vt 0.108553 0.000000 +vt 0.055921 0.000000 +vt 0.003289 0.000000 +vt 0.838816 0.000000 +vt 0.786184 0.000000 +vt 0.733553 0.000000 +vt 0.680921 0.000000 +vt 0.628289 0.000000 +vt 0.575658 0.000000 +vt 0.523026 0.000000 +vt 0.470395 0.000000 +vt 0.417763 0.000000 +vt 0.319079 0.000000 vt 0.644737 0.888889 vt 0.697368 0.740741 vt 0.539474 0.814815 @@ -3824,22 +3844,22 @@ vt 0.473684 0.685185 vt 0.513158 0.592593 vt 0.578947 0.648148 vt 0.473684 0.685185 -vt 0.059211 0.148148 -vt 0.111842 0.148148 -vt 0.164474 0.148148 -vt 0.217105 0.148148 -vt 0.269737 0.148148 -vt 0.322368 0.148148 -vt 0.375000 0.148148 -vt 0.427632 0.148148 -vt 0.480263 0.148148 -vt 0.638158 0.148148 -vt 0.532895 0.148148 -vt 0.690789 0.148148 -vt 0.585526 0.148148 -vt 0.743421 0.148148 -vt 0.796053 0.148148 -vt 0.006579 0.148148 +vt 0.055921 0.148148 +vt 0.108553 0.148148 +vt 0.161184 0.148148 +vt 0.213816 0.148148 +vt 0.266447 0.148148 +vt 0.319079 0.148148 +vt 0.371711 0.148148 +vt 0.424342 0.148148 +vt 0.476974 0.148148 +vt 0.634869 0.148148 +vt 0.529605 0.148148 +vt 0.687500 0.148148 +vt 0.582237 0.148148 +vt 0.740132 0.148148 +vt 0.792763 0.148148 +vt 0.003289 0.148148 vt 0.960526 0.000000 vt 0.980263 0.370370 vt 0.960526 0.370370 @@ -3857,22 +3877,22 @@ vt 0.921053 0.370370 vt 0.921053 0.000000 vt 0.940789 0.370370 vt 0.940789 0.000000 -vt 0.105263 0.148148 -vt 0.157895 0.148148 -vt 0.210526 0.148148 -vt 0.263158 0.148148 -vt 0.315789 0.148148 -vt 0.368421 0.148148 -vt 0.421053 0.148148 -vt 0.473684 0.148148 -vt 0.526316 0.148148 -vt 0.684211 0.148148 -vt 0.578947 0.148148 -vt 0.736842 0.148148 -vt 0.631579 0.148148 -vt 0.789474 0.148148 -vt 0.842105 0.148148 -vt 0.052632 0.148148 +vt 0.101974 0.148148 +vt 0.154605 0.148148 +vt 0.207237 0.148148 +vt 0.259868 0.148148 +vt 0.312500 0.148148 +vt 0.365132 0.148148 +vt 0.417763 0.148148 +vt 0.470395 0.148148 +vt 0.523026 0.148148 +vt 0.680921 0.148148 +vt 0.575658 0.148148 +vt 0.733553 0.148148 +vt 0.628289 0.148148 +vt 0.786184 0.148148 +vt 0.838816 0.148148 +vt 0.049342 0.148148 vt 1.000000 0.000000 vn 1.0000 0.0000 0.0000 vn -1.0000 0.0000 0.0000 @@ -3899,752 +3919,752 @@ vn -0.9239 0.0000 0.3827 vn -0.0000 -0.7071 -0.7071 vn -0.0000 -0.7071 0.7071 s off -f 566/989/107 564/990/107 565/991/107 -f 568/992/108 569/993/108 567/994/108 -f 570/995/109 573/996/109 569/993/109 -f 574/997/107 571/998/107 573/996/107 -f 572/999/110 567/994/110 571/1000/110 -f 573/996/111 567/1001/111 569/1002/111 -f 570/1003/112 572/1004/112 574/997/112 -f 576/1005/108 577/1006/108 575/1007/108 -f 578/1008/109 581/1009/109 577/1006/109 -f 582/1010/107 579/1011/107 581/1009/107 -f 580/1012/110 575/1007/110 579/1013/110 -f 581/1009/111 575/1014/111 577/1015/111 -f 578/1016/112 580/1017/112 582/1010/112 -f 584/1018/108 585/1019/108 583/1020/108 -f 586/1021/109 589/1022/109 585/1019/109 -f 590/1023/107 587/1024/107 589/1022/107 -f 588/1025/110 583/1020/110 587/1026/110 -f 589/1022/111 583/1027/111 585/1028/111 -f 586/1029/112 588/1030/112 590/1023/112 -f 592/1031/108 593/1032/108 591/1033/108 -f 594/1034/109 597/1035/109 593/1032/109 -f 598/1036/107 595/1037/107 597/1035/107 -f 596/1038/110 591/1033/110 595/1039/110 -f 597/1035/111 591/1040/111 593/1041/111 -f 594/1042/112 596/1043/112 598/1036/112 -f 565/991/111 602/1044/111 566/989/111 -f 563/1045/112 600/1046/112 564/990/112 -f 602/1044/108 600/1047/108 599/1048/108 -f 606/1049/107 604/1050/107 605/1051/107 -f 605/1051/111 610/1052/111 606/1049/111 -f 603/1053/112 608/1054/112 604/1055/112 -f 610/1052/108 608/1054/108 607/1056/108 -f 614/1057/109 612/1058/109 613/1059/109 +f 574/997/107 572/998/107 573/999/107 +f 576/1000/108 577/1001/108 575/1002/108 +f 578/1003/109 581/1004/109 577/1001/109 +f 582/1005/107 579/1006/107 581/1004/107 +f 580/1007/110 575/1002/110 579/1008/110 +f 581/1004/111 575/1009/111 577/1010/111 +f 578/1011/112 580/1012/112 582/1005/112 +f 584/1013/108 585/1014/108 583/1015/108 +f 586/1016/109 589/1017/109 585/1014/109 +f 590/1018/107 587/1019/107 589/1017/107 +f 588/1020/110 583/1015/110 587/1021/110 +f 589/1017/111 583/1022/111 585/1023/111 +f 586/1024/112 588/1025/112 590/1018/112 +f 592/1026/108 593/1027/108 591/1028/108 +f 594/1029/109 597/1030/109 593/1027/109 +f 598/1031/107 595/1032/107 597/1030/107 +f 596/1033/110 591/1028/110 595/1034/110 +f 597/1030/111 591/1035/111 593/1036/111 +f 594/1037/112 596/1038/112 598/1031/112 +f 600/1039/108 601/1040/108 599/1041/108 +f 602/1042/109 605/1043/109 601/1040/109 +f 606/1044/107 603/1045/107 605/1043/107 +f 604/1046/110 599/1041/110 603/1047/110 +f 605/1043/111 599/1048/111 601/1049/111 +f 602/1050/112 604/1051/112 606/1044/112 +f 573/999/111 610/1052/111 574/997/111 +f 571/1053/112 608/1054/112 572/998/112 +f 610/1052/108 608/1055/108 607/1056/108 +f 614/1057/107 612/1058/107 613/1059/107 f 613/1059/111 618/1060/111 614/1057/111 -f 611/1061/112 616/1062/112 612/1058/112 -f 618/1060/110 616/1063/110 615/1064/110 +f 611/1061/112 616/1062/112 612/1063/112 +f 618/1060/108 616/1062/108 615/1064/108 f 622/1065/109 620/1066/109 621/1067/109 f 621/1067/111 626/1068/111 622/1065/111 -f 619/1069/112 624/1070/112 620/1071/112 -f 626/1068/110 624/1070/110 623/1072/110 -f 628/1073/107 629/1074/107 627/1075/107 -f 633/1076/111 642/1077/111 634/1078/111 -f 630/1079/109 635/1080/109 629/1074/109 -f 627/1075/110 637/1081/110 628/1073/110 -f 628/1073/111 638/1082/111 630/1079/111 -f 629/1074/112 636/1083/112 627/1075/112 -f 632/1084/108 635/1085/108 631/1086/108 -f 633/1087/108 636/1088/108 632/1089/108 -f 634/1078/108 637/1090/108 633/1076/108 -f 631/1091/108 638/1092/108 634/1093/108 -f 631/1086/112 640/1094/112 632/1084/112 -f 634/1093/109 639/1095/109 631/1091/109 -f 632/1089/110 641/1096/110 633/1087/110 -f 645/1097/111 644/1098/111 643/1099/111 -f 649/1100/112 647/1101/112 648/1102/112 -f 645/1103/108 650/1104/108 646/1105/108 -f 644/1098/107 648/1102/107 643/1099/107 -f 646/1106/109 649/1100/109 644/1107/109 -f 643/1108/110 647/1101/110 645/1109/110 -f 653/1110/111 652/1111/111 651/1112/111 -f 657/1113/112 655/1114/112 656/1115/112 -f 653/1116/108 658/1117/108 654/1118/108 -f 652/1111/107 656/1115/107 651/1112/107 -f 654/1119/109 657/1113/109 652/1120/109 -f 651/1121/110 655/1114/110 653/1122/110 -f 661/1123/111 660/1124/111 659/1125/111 -f 665/1126/112 663/1127/112 664/1128/112 -f 661/1129/108 666/1130/108 662/1131/108 -f 660/1124/107 664/1128/107 659/1125/107 -f 662/1132/109 665/1126/109 660/1133/109 -f 659/1134/110 663/1127/110 661/1135/110 -f 667/1136/111 676/1137/111 668/1138/111 -f 673/1139/112 677/1140/112 672/1141/112 -f 668/1138/107 678/1142/107 673/1143/107 -f 669/1144/109 674/1145/109 670/1146/109 -f 668/1138/110 672/1147/110 667/1136/110 -f 677/1140/109 676/1137/109 675/1148/109 -f 672/1149/108 675/1148/108 667/1136/108 -f 680/1150/109 681/1151/109 679/1152/109 -f 686/1153/110 683/1154/110 684/1155/110 -f 681/1156/111 684/1157/111 679/1158/111 -f 679/1159/108 683/1154/108 680/1150/108 -f 680/1150/112 685/1160/112 682/1161/112 -f 682/1161/107 686/1162/107 681/1156/107 -f 689/1163/110 688/1164/110 687/1165/110 -f 669/1166/108 690/1167/108 671/1168/108 -f 671/1168/112 689/1163/112 674/1145/112 -f 670/1169/111 688/1170/111 669/1171/111 -f 674/1145/107 687/1172/107 670/1169/107 -f 700/1173/112 717/1174/112 716/1175/112 -f 699/1176/112 716/1177/112 715/1178/112 -f 698/1179/112 715/1180/112 714/1181/112 -f 697/1182/112 714/1183/112 713/1184/112 -f 696/1185/112 713/1186/112 712/1187/112 -f 695/1188/112 712/1189/112 711/1190/112 -f 695/1191/112 710/1192/112 694/1193/112 -f 694/1193/112 709/1194/112 693/1195/112 -f 693/1195/112 708/1196/112 692/1197/112 -f 692/1197/112 707/1198/112 691/1199/112 -f 691/1199/112 722/1200/112 706/1201/112 -f 706/1201/112 721/1202/112 705/1203/112 -f 705/1203/112 720/1204/112 704/1205/112 -f 704/1205/112 719/1206/112 703/1207/112 -f 703/1207/112 718/1208/112 702/1209/112 -f 701/1210/112 718/1211/112 717/1212/112 -f 732/1213/111 749/1214/111 733/1215/111 -f 731/1216/111 748/1217/111 732/1213/111 -f 730/1218/111 747/1219/111 731/1216/111 -f 729/1220/111 746/1221/111 730/1218/111 -f 728/1222/111 745/1223/111 729/1220/111 -f 727/1224/111 744/1225/111 728/1222/111 -f 742/1226/111 727/1227/111 726/1228/111 -f 741/1229/111 726/1228/111 725/1230/111 -f 739/1231/111 725/1230/111 723/1232/111 -f 740/1233/111 723/1232/111 724/1234/111 -f 754/1235/111 724/1234/111 738/1236/111 -f 753/1237/111 738/1236/111 737/1238/111 -f 752/1239/111 737/1238/111 736/1240/111 -f 751/1241/111 736/1240/111 735/1242/111 -f 750/1243/111 735/1242/111 734/1244/111 -f 733/1215/111 750/1245/111 734/1244/111 -f 756/1246/112 757/1247/112 755/1248/112 -f 761/1249/107 802/1250/107 762/1251/107 -f 757/1247/108 796/1252/108 755/1248/108 -f 758/1253/109 795/1254/109 757/1247/109 -f 755/1248/110 797/1255/110 756/1246/110 -f 756/1246/107 798/1256/107 758/1253/107 -f 794/1257/108 863/1258/108 792/1259/108 -f 791/1260/107 865/1261/107 793/1262/107 -f 779/1263/108 851/1264/108 781/1265/108 -f 781/1265/109 854/1266/109 782/1267/109 -f 780/1268/110 852/1269/110 779/1263/110 -f 785/1270/112 784/1271/112 786/1272/112 -f 769/1273/112 768/1274/112 770/1275/112 -f 764/1276/110 858/1277/110 763/1278/110 -f 765/1279/109 855/1280/109 766/1281/109 -f 763/1278/108 856/1282/108 765/1279/108 -f 775/1283/107 861/1284/107 777/1285/107 -f 778/1286/108 859/1287/108 776/1288/108 -f 776/1288/109 862/1289/109 775/1283/109 -f 777/1290/110 860/1291/110 778/1286/110 -f 772/1292/112 773/1293/112 771/1294/112 -f 766/1281/107 857/1295/107 764/1296/107 -f 792/1259/109 866/1297/109 791/1260/109 -f 793/1298/110 864/1299/110 794/1257/110 -f 788/1300/112 789/1301/112 787/1302/112 -f 782/1267/107 853/1303/107 780/1304/107 -f 760/1305/111 795/1306/111 759/1307/111 -f 761/1308/111 796/1309/111 760/1310/111 -f 762/1251/111 797/1311/111 761/1249/111 -f 759/1312/111 798/1313/111 762/1314/111 -f 799/1315/111 801/1316/111 800/1317/111 -f 759/1307/108 800/1318/108 760/1305/108 -f 762/1314/109 799/1319/109 759/1312/109 -f 760/1310/110 801/1320/110 761/1308/110 -f 805/1321/111 804/1322/111 803/1323/111 -f 808/1324/112 810/1325/112 807/1326/112 -f 804/1322/113 808/1324/113 803/1323/113 -f 805/1327/114 810/1325/114 806/1328/114 +f 619/1069/112 624/1070/112 620/1066/112 +f 626/1068/110 624/1071/110 623/1072/110 +f 630/1073/109 628/1074/109 629/1075/109 +f 629/1075/111 634/1076/111 630/1073/111 +f 627/1077/112 632/1078/112 628/1079/112 +f 634/1076/110 632/1078/110 631/1080/110 +f 636/1081/107 637/1082/107 635/1083/107 +f 641/1084/111 650/1085/111 642/1086/111 +f 638/1087/109 643/1088/109 637/1082/109 +f 635/1083/110 645/1089/110 636/1081/110 +f 636/1081/111 646/1090/111 638/1087/111 +f 637/1082/112 644/1091/112 635/1083/112 +f 640/1092/108 643/1093/108 639/1094/108 +f 641/1095/108 644/1096/108 640/1097/108 +f 642/1086/108 645/1098/108 641/1084/108 +f 639/1099/108 646/1100/108 642/1101/108 +f 639/1094/112 648/1102/112 640/1092/112 +f 642/1101/109 647/1103/109 639/1099/109 +f 640/1097/110 649/1104/110 641/1095/110 +f 653/1105/111 652/1106/111 651/1107/111 +f 657/1108/112 655/1109/112 656/1110/112 +f 653/1111/108 658/1112/108 654/1113/108 +f 652/1106/107 656/1110/107 651/1107/107 +f 654/1114/109 657/1108/109 652/1115/109 +f 651/1116/110 655/1109/110 653/1117/110 +f 661/1118/111 660/1119/111 659/1120/111 +f 665/1121/112 663/1122/112 664/1123/112 +f 661/1124/108 666/1125/108 662/1126/108 +f 660/1119/107 664/1123/107 659/1120/107 +f 662/1127/109 665/1121/109 660/1128/109 +f 659/1129/110 663/1122/110 661/1130/110 +f 669/1131/111 668/1132/111 667/1133/111 +f 673/1134/112 671/1135/112 672/1136/112 +f 669/1137/108 674/1138/108 670/1139/108 +f 668/1132/107 672/1136/107 667/1133/107 +f 670/1140/109 673/1134/109 668/1141/109 +f 667/1142/110 671/1135/110 669/1143/110 +f 675/1144/111 684/1145/111 676/1146/111 +f 681/1147/112 685/1148/112 680/1149/112 +f 676/1146/107 686/1150/107 681/1151/107 +f 677/1152/109 682/1153/109 678/1154/109 +f 676/1146/110 680/1155/110 675/1144/110 +f 685/1148/109 684/1145/109 683/1156/109 +f 680/1157/108 683/1156/108 675/1144/108 +f 688/1158/109 689/1159/109 687/1160/109 +f 694/1161/110 691/1162/110 692/1163/110 +f 689/1164/111 692/1165/111 687/1166/111 +f 687/1167/108 691/1162/108 688/1158/108 +f 688/1158/112 693/1168/112 690/1169/112 +f 690/1169/107 694/1170/107 689/1164/107 +f 697/1171/110 696/1172/110 695/1173/110 +f 677/1174/108 698/1175/108 679/1176/108 +f 679/1176/112 697/1171/112 682/1153/112 +f 678/1177/111 696/1178/111 677/1179/111 +f 682/1153/107 695/1180/107 678/1177/107 +f 708/1181/112 725/1182/112 724/1183/112 +f 707/1184/112 724/1185/112 723/1186/112 +f 706/1187/112 723/1188/112 722/1189/112 +f 705/1190/112 722/1191/112 721/1192/112 +f 704/1193/112 721/1194/112 720/1195/112 +f 703/1196/112 720/1197/112 719/1198/112 +f 703/1199/112 718/1200/112 702/1201/112 +f 702/1201/112 717/1202/112 701/1203/112 +f 701/1203/112 716/1204/112 700/1205/112 +f 700/1205/112 715/1206/112 699/1207/112 +f 699/1207/112 730/1208/112 714/1209/112 +f 714/1209/112 729/1210/112 713/1211/112 +f 713/1211/112 728/1212/112 712/1213/112 +f 712/1213/112 727/1214/112 711/1215/112 +f 711/1215/112 726/1216/112 710/1217/112 +f 709/1218/112 726/1219/112 725/1220/112 +f 740/1221/111 757/1222/111 741/1223/111 +f 739/1224/111 756/1225/111 740/1221/111 +f 738/1226/111 755/1227/111 739/1224/111 +f 737/1228/111 754/1229/111 738/1226/111 +f 736/1230/111 753/1231/111 737/1228/111 +f 735/1232/111 752/1233/111 736/1230/111 +f 750/1234/111 735/1235/111 734/1236/111 +f 749/1237/111 734/1236/111 733/1238/111 +f 747/1239/111 733/1238/111 731/1240/111 +f 748/1241/111 731/1240/111 732/1242/111 +f 762/1243/111 732/1242/111 746/1244/111 +f 761/1245/111 746/1244/111 745/1246/111 +f 760/1247/111 745/1246/111 744/1248/111 +f 759/1249/111 744/1248/111 743/1250/111 +f 758/1251/111 743/1250/111 742/1252/111 +f 741/1223/111 758/1253/111 742/1252/111 +f 764/1254/112 765/1255/112 763/1256/112 +f 769/1257/107 810/1258/107 770/1259/107 +f 765/1255/108 804/1260/108 763/1256/108 +f 766/1261/109 803/1262/109 765/1255/109 +f 763/1256/110 805/1263/110 764/1254/110 +f 764/1254/107 806/1264/107 766/1261/107 +f 802/1265/108 871/1266/108 800/1267/108 +f 799/1268/107 873/1269/107 801/1270/107 +f 787/1271/108 859/1272/108 789/1273/108 +f 789/1273/109 862/1274/109 790/1275/109 +f 788/1276/110 860/1277/110 787/1271/110 +f 793/1278/112 792/1279/112 794/1280/112 +f 777/1281/112 776/1282/112 778/1283/112 +f 772/1284/110 866/1285/110 771/1286/110 +f 773/1287/109 863/1288/109 774/1289/109 +f 771/1286/108 864/1290/108 773/1287/108 +f 783/1291/107 869/1292/107 785/1293/107 +f 786/1294/108 867/1295/108 784/1296/108 +f 784/1296/109 870/1297/109 783/1291/109 +f 785/1298/110 868/1299/110 786/1294/110 +f 780/1300/112 781/1301/112 779/1302/112 +f 774/1289/107 865/1303/107 772/1304/107 +f 800/1267/109 874/1305/109 799/1268/109 +f 801/1306/110 872/1307/110 802/1265/110 +f 796/1308/112 797/1309/112 795/1310/112 +f 790/1275/107 861/1311/107 788/1312/107 +f 768/1313/111 803/1314/111 767/1315/111 +f 769/1316/111 804/1317/111 768/1318/111 +f 770/1259/111 805/1319/111 769/1257/111 +f 767/1320/111 806/1321/111 770/1322/111 +f 807/1323/111 809/1324/111 808/1325/111 +f 767/1315/108 808/1326/108 768/1313/108 +f 770/1322/109 807/1327/109 767/1320/109 +f 768/1318/110 809/1328/110 769/1316/110 f 813/1329/111 812/1330/111 811/1331/111 f 816/1332/112 818/1333/112 815/1334/112 -f 812/1330/115 816/1332/115 811/1331/115 -f 813/1335/116 818/1333/116 814/1336/116 -f 820/1337/112 840/1338/112 837/1339/112 -f 849/1340/108 848/1341/108 850/1342/108 -f 838/1343/111 841/1344/111 819/1345/111 -f 846/1346/111 849/1340/111 843/1347/111 -f 841/1344/107 840/1338/107 842/1348/107 -f 830/1349/107 828/1350/107 826/1351/107 -f 844/1352/112 848/1341/112 845/1353/112 -f 827/1354/108 831/1355/108 835/1356/108 -f 784/1357/117 852/1269/117 786/1358/117 -f 786/1359/118 853/1360/118 785/1361/118 -f 785/1270/119 854/1266/119 783/1362/119 -f 783/1363/120 851/1264/120 784/1364/120 -f 767/1365/120 856/1282/120 768/1366/120 -f 769/1273/119 855/1280/119 767/1367/119 -f 770/1368/118 857/1369/118 769/1370/118 -f 768/1371/117 858/1277/117 770/1372/117 -f 773/1373/117 860/1291/117 771/1374/117 -f 771/1375/118 861/1376/118 772/1377/118 -f 772/1292/119 862/1289/119 774/1378/119 -f 774/1379/120 859/1287/120 773/1380/120 -f 789/1381/117 864/1299/117 787/1382/117 -f 787/1383/118 865/1384/118 788/1385/118 -f 788/1300/119 866/1297/119 790/1386/119 -f 790/1387/120 863/1258/120 789/1388/120 -f 868/1389/107 869/1390/107 867/1391/107 -f 873/1392/111 882/1393/111 874/1394/111 -f 870/1395/109 875/1396/109 869/1390/109 -f 867/1391/110 877/1397/110 868/1389/110 -f 868/1389/111 878/1398/111 870/1395/111 -f 869/1390/112 876/1399/112 867/1391/112 -f 872/1400/108 875/1401/108 871/1402/108 -f 873/1403/108 876/1404/108 872/1405/108 -f 874/1394/108 877/1406/108 873/1392/108 -f 871/1407/108 878/1408/108 874/1409/108 -f 871/1402/112 880/1410/112 872/1400/112 -f 874/1409/109 879/1411/109 871/1407/109 -f 872/1405/110 881/1412/110 873/1403/110 -f 884/1413/107 885/1414/107 883/1415/107 -f 889/1416/111 898/1417/111 890/1418/111 -f 886/1419/109 891/1420/109 885/1414/109 -f 883/1415/110 893/1421/110 884/1413/110 -f 884/1413/111 894/1422/111 886/1419/111 -f 885/1414/112 892/1423/112 883/1415/112 -f 888/1424/108 891/1425/108 887/1426/108 -f 889/1427/108 892/1428/108 888/1429/108 -f 890/1418/108 893/1430/108 889/1416/108 -f 887/1431/108 894/1432/108 890/1433/108 -f 887/1426/112 896/1434/112 888/1424/112 -f 890/1433/109 895/1435/109 887/1431/109 -f 888/1429/110 897/1436/110 889/1427/110 -f 900/1437/108 901/1438/108 899/1439/108 -f 905/1440/111 914/1441/111 906/1442/111 -f 902/1443/110 907/1444/110 901/1438/110 -f 899/1439/109 909/1445/109 900/1437/109 -f 900/1437/111 910/1446/111 902/1443/111 -f 901/1438/112 908/1447/112 899/1439/112 -f 904/1448/107 907/1449/107 903/1450/107 -f 905/1451/107 908/1452/107 904/1453/107 -f 906/1442/107 909/1454/107 905/1440/107 -f 903/1455/107 910/1456/107 906/1457/107 -f 903/1450/112 912/1458/112 904/1448/112 -f 906/1457/110 911/1459/110 903/1455/110 -f 904/1453/109 913/1460/109 905/1451/109 -f 916/1461/108 917/1462/108 915/1463/108 -f 921/1464/111 930/1465/111 922/1466/111 -f 918/1467/110 923/1468/110 917/1462/110 -f 915/1463/109 925/1469/109 916/1461/109 -f 916/1461/111 926/1470/111 918/1467/111 -f 917/1462/112 924/1471/112 915/1463/112 -f 920/1472/107 923/1473/107 919/1474/107 -f 921/1475/107 924/1476/107 920/1477/107 -f 922/1466/107 925/1478/107 921/1464/107 -f 919/1479/107 926/1480/107 922/1481/107 -f 919/1474/112 928/1482/112 920/1472/112 -f 922/1481/110 927/1483/110 919/1479/110 -f 920/1477/109 929/1484/109 921/1475/109 -f 932/1485/108 933/1486/108 931/1487/108 -f 937/1488/111 946/1489/111 938/1490/111 -f 934/1491/110 939/1492/110 933/1486/110 -f 931/1487/109 941/1493/109 932/1485/109 -f 932/1485/111 942/1494/111 934/1491/111 -f 933/1486/112 940/1495/112 931/1487/112 -f 936/1496/107 939/1497/107 935/1498/107 -f 937/1499/107 940/1500/107 936/1501/107 -f 938/1490/107 941/1502/107 937/1488/107 -f 935/1503/107 942/1504/107 938/1505/107 -f 935/1498/112 944/1506/112 936/1496/112 -f 938/1505/110 943/1507/110 935/1503/110 -f 936/1501/109 945/1508/109 937/1499/109 -f 948/1509/109 949/1510/109 947/1511/109 -f 953/1512/111 962/1513/111 954/1514/111 -f 950/1515/108 955/1516/108 949/1510/108 -f 947/1511/107 957/1517/107 948/1509/107 -f 948/1509/111 958/1518/111 950/1515/111 -f 949/1510/112 956/1519/112 947/1511/112 -f 952/1520/110 955/1521/110 951/1522/110 -f 953/1523/110 956/1524/110 952/1525/110 -f 954/1514/110 957/1526/110 953/1512/110 -f 951/1527/110 958/1528/110 954/1529/110 -f 951/1522/112 960/1530/112 952/1520/112 -f 954/1529/108 959/1531/108 951/1527/108 -f 952/1525/107 961/1532/107 953/1523/107 -f 964/1533/109 965/1534/109 963/1535/109 -f 969/1536/111 978/1537/111 970/1538/111 -f 966/1539/108 971/1540/108 965/1534/108 -f 963/1535/107 973/1541/107 964/1533/107 -f 964/1533/111 974/1542/111 966/1539/111 -f 965/1534/112 972/1543/112 963/1535/112 -f 968/1544/110 971/1545/110 967/1546/110 -f 969/1547/110 972/1548/110 968/1549/110 -f 970/1538/110 973/1550/110 969/1536/110 -f 967/1551/110 974/1552/110 970/1553/110 -f 967/1546/112 976/1554/112 968/1544/112 -f 970/1553/108 975/1555/108 967/1551/108 -f 968/1549/107 977/1556/107 969/1547/107 -f 980/1557/109 981/1558/109 979/1559/109 -f 985/1560/111 994/1561/111 986/1562/111 -f 982/1563/108 987/1564/108 981/1558/108 -f 979/1559/107 989/1565/107 980/1557/107 -f 980/1557/111 990/1566/111 982/1563/111 -f 981/1558/112 988/1567/112 979/1559/112 -f 984/1568/110 987/1569/110 983/1570/110 -f 985/1571/110 988/1572/110 984/1573/110 -f 986/1562/110 989/1574/110 985/1560/110 -f 983/1575/110 990/1576/110 986/1577/110 -f 984/1568/112 991/1578/112 992/1579/112 -f 986/1577/108 991/1580/108 983/1575/108 -f 984/1573/107 993/1581/107 985/1571/107 -f 996/1582/110 997/1583/110 995/1584/110 -f 1001/1585/111 1010/1586/111 1002/1587/111 -f 998/1588/107 1003/1589/107 997/1583/107 -f 995/1584/108 1005/1590/108 996/1582/108 -f 996/1582/111 1006/1591/111 998/1588/111 -f 997/1583/112 1004/1592/112 995/1584/112 -f 1000/1593/109 1003/1594/109 999/1595/109 -f 1001/1596/109 1004/1597/109 1000/1598/109 -f 1002/1587/109 1005/1599/109 1001/1585/109 -f 999/1600/109 1006/1601/109 1002/1602/109 -f 1000/1593/112 1007/1603/112 1008/1604/112 -f 1002/1602/107 1007/1605/107 999/1600/107 -f 1000/1598/108 1009/1606/108 1001/1596/108 -f 1012/1607/110 1013/1608/110 1011/1609/110 -f 1017/1610/111 1026/1611/111 1018/1612/111 -f 1014/1613/107 1019/1614/107 1013/1608/107 -f 1011/1609/108 1021/1615/108 1012/1607/108 -f 1012/1607/111 1022/1616/111 1014/1613/111 -f 1013/1608/112 1020/1617/112 1011/1609/112 -f 1016/1618/109 1019/1619/109 1015/1620/109 -f 1017/1621/109 1020/1622/109 1016/1623/109 -f 1018/1612/109 1021/1624/109 1017/1610/109 -f 1015/1625/109 1022/1626/109 1018/1627/109 -f 1015/1620/112 1024/1628/112 1016/1618/112 -f 1018/1627/107 1023/1629/107 1015/1625/107 -f 1016/1623/108 1025/1630/108 1017/1621/108 -f 1028/1631/110 1029/1632/110 1027/1633/110 -f 1033/1634/111 1042/1635/111 1034/1636/111 -f 1030/1637/107 1035/1638/107 1029/1632/107 -f 1027/1633/108 1037/1639/108 1028/1631/108 -f 1028/1631/111 1038/1640/111 1030/1637/111 -f 1027/1633/112 1035/1641/112 1036/1642/112 -f 1032/1643/109 1035/1641/109 1031/1644/109 -f 1033/1645/109 1036/1646/109 1032/1647/109 -f 1034/1636/109 1037/1648/109 1033/1634/109 -f 1031/1649/109 1038/1650/109 1034/1651/109 -f 1032/1643/112 1039/1652/112 1040/1653/112 -f 1034/1651/107 1039/1654/107 1031/1649/107 -f 1032/1647/108 1041/1655/108 1033/1645/108 -f 566/989/107 563/1045/107 564/990/107 -f 568/992/108 570/995/108 569/993/108 -f 570/995/109 574/997/109 573/996/109 -f 574/997/107 572/1004/107 571/998/107 -f 572/999/110 568/992/110 567/994/110 -f 573/996/111 571/998/111 567/1001/111 -f 570/1003/112 568/1656/112 572/1004/112 -f 576/1005/108 578/1008/108 577/1006/108 -f 578/1008/109 582/1010/109 581/1009/109 -f 582/1010/107 580/1017/107 579/1011/107 -f 580/1012/110 576/1005/110 575/1007/110 -f 581/1009/111 579/1011/111 575/1014/111 -f 578/1016/112 576/1657/112 580/1017/112 -f 584/1018/108 586/1021/108 585/1019/108 -f 586/1021/109 590/1023/109 589/1022/109 -f 590/1023/107 588/1030/107 587/1024/107 -f 588/1025/110 584/1018/110 583/1020/110 -f 589/1022/111 587/1024/111 583/1027/111 -f 586/1029/112 584/1658/112 588/1030/112 -f 592/1031/108 594/1034/108 593/1032/108 -f 594/1034/109 598/1036/109 597/1035/109 -f 598/1036/107 596/1043/107 595/1037/107 -f 596/1038/110 592/1031/110 591/1033/110 -f 597/1035/111 595/1037/111 591/1040/111 -f 594/1042/112 592/1659/112 596/1043/112 -f 565/991/111 601/1660/111 602/1044/111 -f 563/1045/112 599/1661/112 600/1046/112 -f 602/1044/108 601/1660/108 600/1047/108 -f 606/1049/107 603/1662/107 604/1050/107 -f 605/1051/111 609/1663/111 610/1052/111 -f 603/1053/112 607/1056/112 608/1054/112 -f 610/1052/108 609/1663/108 608/1054/108 -f 614/1057/109 611/1061/109 612/1058/109 -f 613/1059/111 617/1664/111 618/1060/111 -f 611/1061/112 615/1665/112 616/1062/112 -f 618/1060/110 617/1664/110 616/1063/110 -f 622/1065/109 619/1666/109 620/1066/109 -f 621/1067/111 625/1667/111 626/1068/111 -f 619/1069/112 623/1072/112 624/1070/112 -f 626/1068/110 625/1667/110 624/1070/110 -f 628/1073/107 630/1079/107 629/1074/107 -f 633/1076/111 641/1668/111 642/1077/111 -f 630/1079/109 638/1092/109 635/1080/109 -f 627/1075/110 636/1088/110 637/1081/110 -f 628/1073/111 637/1090/111 638/1082/111 -f 629/1074/112 635/1085/112 636/1083/112 -f 632/1084/108 636/1083/108 635/1085/108 -f 633/1087/108 637/1081/108 636/1088/108 -f 634/1078/108 638/1082/108 637/1090/108 -f 631/1091/108 635/1080/108 638/1092/108 -f 631/1086/112 639/1669/112 640/1094/112 -f 634/1093/109 642/1670/109 639/1095/109 -f 632/1089/110 640/1671/110 641/1096/110 -f 645/1097/111 646/1672/111 644/1098/111 -f 649/1100/112 650/1104/112 647/1101/112 -f 645/1103/108 647/1101/108 650/1104/108 -f 644/1098/107 649/1100/107 648/1102/107 -f 646/1106/109 650/1104/109 649/1100/109 -f 643/1108/110 648/1102/110 647/1101/110 -f 653/1110/111 654/1673/111 652/1111/111 -f 657/1113/112 658/1117/112 655/1114/112 -f 653/1116/108 655/1114/108 658/1117/108 -f 652/1111/107 657/1113/107 656/1115/107 -f 654/1119/109 658/1117/109 657/1113/109 -f 651/1121/110 656/1115/110 655/1114/110 -f 661/1123/111 662/1674/111 660/1124/111 -f 665/1126/112 666/1130/112 663/1127/112 -f 661/1129/108 663/1127/108 666/1130/108 -f 660/1124/107 665/1126/107 664/1128/107 -f 662/1132/109 666/1130/109 665/1126/109 -f 659/1134/110 664/1128/110 663/1127/110 -f 667/1136/111 675/1148/111 676/1137/111 -f 673/1139/112 678/1675/112 677/1140/112 -f 668/1138/107 676/1137/107 678/1142/107 -f 669/1144/109 671/1168/109 674/1145/109 -f 668/1138/110 673/1676/110 672/1147/110 -f 677/1140/109 678/1675/109 676/1137/109 -f 672/1149/108 677/1677/108 675/1148/108 -f 680/1150/109 682/1161/109 681/1151/109 -f 686/1153/110 685/1160/110 683/1154/110 -f 681/1156/111 686/1162/111 684/1157/111 -f 679/1159/108 684/1678/108 683/1154/108 -f 680/1150/112 683/1154/112 685/1160/112 -f 682/1161/107 685/1160/107 686/1162/107 -f 689/1163/110 690/1167/110 688/1164/110 -f 669/1166/108 688/1679/108 690/1167/108 -f 671/1168/112 690/1167/112 689/1163/112 -f 670/1169/111 687/1172/111 688/1170/111 -f 674/1145/107 689/1163/107 687/1172/107 -f 700/1173/112 701/1210/112 717/1174/112 -f 699/1176/112 700/1173/112 716/1177/112 -f 698/1179/112 699/1176/112 715/1180/112 -f 697/1182/112 698/1179/112 714/1183/112 -f 696/1185/112 697/1182/112 713/1186/112 -f 695/1188/112 696/1185/112 712/1189/112 -f 695/1191/112 711/1680/112 710/1192/112 -f 694/1193/112 710/1681/112 709/1194/112 -f 693/1195/112 709/1682/112 708/1196/112 -f 692/1197/112 708/1683/112 707/1198/112 -f 691/1199/112 707/1684/112 722/1200/112 -f 706/1201/112 722/1685/112 721/1202/112 -f 705/1203/112 721/1686/112 720/1204/112 -f 704/1205/112 720/1687/112 719/1206/112 -f 703/1207/112 719/1688/112 718/1208/112 -f 701/1210/112 702/1209/112 718/1211/112 -f 732/1213/111 748/1689/111 749/1214/111 -f 731/1216/111 747/1690/111 748/1217/111 -f 730/1218/111 746/1691/111 747/1219/111 -f 729/1220/111 745/1692/111 746/1221/111 -f 728/1222/111 744/1693/111 745/1223/111 -f 727/1224/111 743/1694/111 744/1225/111 -f 742/1226/111 743/1695/111 727/1227/111 -f 741/1229/111 742/1696/111 726/1228/111 -f 739/1231/111 741/1697/111 725/1230/111 -f 740/1233/111 739/1698/111 723/1232/111 -f 754/1235/111 740/1699/111 724/1234/111 -f 753/1237/111 754/1700/111 738/1236/111 -f 752/1239/111 753/1701/111 737/1238/111 -f 751/1241/111 752/1702/111 736/1240/111 -f 750/1243/111 751/1703/111 735/1242/111 -f 733/1215/111 749/1704/111 750/1245/111 -f 756/1246/112 758/1253/112 757/1247/112 -f 761/1249/107 801/1316/107 802/1250/107 -f 757/1247/108 795/1306/108 796/1252/108 -f 758/1253/109 798/1313/109 795/1254/109 -f 755/1248/110 796/1309/110 797/1255/110 -f 756/1246/107 797/1311/107 798/1256/107 -f 794/1257/108 864/1299/108 863/1258/108 -f 791/1260/107 866/1297/107 865/1261/107 -f 779/1263/108 852/1269/108 851/1264/108 -f 781/1265/109 851/1264/109 854/1266/109 -f 780/1268/110 853/1360/110 852/1269/110 -f 785/1270/112 783/1362/112 784/1271/112 -f 769/1273/112 767/1367/112 768/1274/112 -f 764/1276/110 857/1369/110 858/1277/110 -f 765/1279/109 856/1282/109 855/1280/109 -f 763/1278/108 858/1277/108 856/1282/108 -f 775/1283/107 862/1289/107 861/1284/107 -f 778/1286/108 860/1291/108 859/1287/108 -f 776/1288/109 859/1287/109 862/1289/109 -f 777/1290/110 861/1376/110 860/1291/110 -f 772/1292/112 774/1378/112 773/1293/112 -f 766/1281/107 855/1280/107 857/1295/107 -f 792/1259/109 863/1258/109 866/1297/109 -f 793/1298/110 865/1384/110 864/1299/110 -f 788/1300/112 790/1386/112 789/1301/112 -f 782/1267/107 854/1266/107 853/1303/107 -f 760/1305/111 796/1252/111 795/1306/111 -f 761/1308/111 797/1255/111 796/1309/111 -f 762/1251/111 798/1256/111 797/1311/111 -f 759/1312/111 795/1254/111 798/1313/111 -f 799/1315/111 802/1250/111 801/1316/111 -f 759/1307/108 799/1705/108 800/1318/108 -f 762/1314/109 802/1706/109 799/1319/109 -f 760/1310/110 800/1707/110 801/1320/110 -f 805/1321/111 806/1708/111 804/1322/111 -f 808/1324/112 809/1709/112 810/1325/112 -f 804/1322/113 809/1709/113 808/1324/113 -f 805/1327/114 807/1326/114 810/1325/114 -f 813/1329/111 814/1710/111 812/1330/111 -f 816/1332/112 817/1711/112 818/1333/112 -f 812/1330/115 817/1711/115 816/1332/115 -f 813/1335/116 815/1334/116 818/1333/116 -f 820/1337/112 842/1348/112 840/1338/112 -f 849/1340/108 847/1712/108 848/1341/108 -f 838/1343/111 839/1713/111 841/1344/111 -f 846/1346/111 847/1712/111 849/1340/111 -f 841/1344/107 839/1713/107 840/1338/107 -f 826/1351/107 824/1714/107 822/1715/107 -f 822/1715/107 836/1716/107 826/1351/107 -f 836/1716/107 834/1717/107 826/1351/107 -f 834/1717/107 832/1718/107 826/1351/107 -f 832/1718/107 830/1349/107 826/1351/107 -f 844/1352/112 850/1342/112 848/1341/112 -f 835/1356/108 821/1719/108 823/1720/108 -f 823/1720/108 825/1721/108 827/1354/108 -f 827/1354/108 829/1722/108 831/1355/108 -f 831/1355/108 833/1723/108 835/1356/108 -f 835/1356/108 823/1720/108 827/1354/108 -f 784/1357/117 851/1264/117 852/1269/117 -f 786/1359/118 852/1269/118 853/1360/118 -f 785/1270/119 853/1303/119 854/1266/119 -f 783/1363/120 854/1266/120 851/1264/120 -f 767/1365/120 855/1280/120 856/1282/120 -f 769/1273/119 857/1295/119 855/1280/119 -f 770/1368/118 858/1277/118 857/1369/118 -f 768/1371/117 856/1282/117 858/1277/117 -f 773/1373/117 859/1287/117 860/1291/117 -f 771/1375/118 860/1291/118 861/1376/118 -f 772/1292/119 861/1284/119 862/1289/119 -f 774/1379/120 862/1289/120 859/1287/120 -f 789/1381/117 863/1258/117 864/1299/117 -f 787/1383/118 864/1299/118 865/1384/118 -f 788/1300/119 865/1261/119 866/1297/119 -f 790/1387/120 866/1297/120 863/1258/120 -f 868/1389/107 870/1395/107 869/1390/107 -f 873/1392/111 881/1724/111 882/1393/111 -f 870/1395/109 878/1408/109 875/1396/109 -f 867/1391/110 876/1404/110 877/1397/110 -f 868/1389/111 877/1406/111 878/1398/111 -f 869/1390/112 875/1401/112 876/1399/112 -f 872/1400/108 876/1399/108 875/1401/108 -f 873/1403/108 877/1397/108 876/1404/108 -f 874/1394/108 878/1398/108 877/1406/108 -f 871/1407/108 875/1396/108 878/1408/108 -f 871/1402/112 879/1725/112 880/1410/112 -f 874/1409/109 882/1726/109 879/1411/109 -f 872/1405/110 880/1727/110 881/1412/110 -f 884/1413/107 886/1419/107 885/1414/107 -f 889/1416/111 897/1728/111 898/1417/111 -f 886/1419/109 894/1432/109 891/1420/109 -f 883/1415/110 892/1428/110 893/1421/110 -f 884/1413/111 893/1430/111 894/1422/111 -f 885/1414/112 891/1425/112 892/1423/112 -f 888/1424/108 892/1423/108 891/1425/108 -f 889/1427/108 893/1421/108 892/1428/108 -f 890/1418/108 894/1422/108 893/1430/108 -f 887/1431/108 891/1420/108 894/1432/108 -f 887/1426/112 895/1729/112 896/1434/112 -f 890/1433/109 898/1730/109 895/1435/109 -f 888/1429/110 896/1731/110 897/1436/110 -f 900/1437/108 902/1443/108 901/1438/108 -f 905/1440/111 913/1732/111 914/1441/111 -f 902/1443/110 910/1456/110 907/1444/110 -f 899/1439/109 908/1452/109 909/1445/109 -f 900/1437/111 909/1454/111 910/1446/111 -f 901/1438/112 907/1449/112 908/1447/112 -f 904/1448/107 908/1447/107 907/1449/107 -f 905/1451/107 909/1445/107 908/1452/107 -f 906/1442/107 910/1446/107 909/1454/107 -f 903/1455/107 907/1444/107 910/1456/107 -f 903/1450/112 911/1733/112 912/1458/112 -f 906/1457/110 914/1734/110 911/1459/110 -f 904/1453/109 912/1735/109 913/1460/109 -f 916/1461/108 918/1467/108 917/1462/108 -f 921/1464/111 929/1736/111 930/1465/111 -f 918/1467/110 926/1480/110 923/1468/110 -f 915/1463/109 924/1476/109 925/1469/109 -f 916/1461/111 925/1478/111 926/1470/111 -f 917/1462/112 923/1473/112 924/1471/112 -f 920/1472/107 924/1471/107 923/1473/107 -f 921/1475/107 925/1469/107 924/1476/107 -f 922/1466/107 926/1470/107 925/1478/107 -f 919/1479/107 923/1468/107 926/1480/107 -f 919/1474/112 927/1737/112 928/1482/112 -f 922/1481/110 930/1738/110 927/1483/110 -f 920/1477/109 928/1739/109 929/1484/109 -f 932/1485/108 934/1491/108 933/1486/108 -f 937/1488/111 945/1740/111 946/1489/111 -f 934/1491/110 942/1504/110 939/1492/110 -f 931/1487/109 940/1500/109 941/1493/109 -f 932/1485/111 941/1502/111 942/1494/111 -f 933/1486/112 939/1497/112 940/1495/112 -f 936/1496/107 940/1495/107 939/1497/107 -f 937/1499/107 941/1493/107 940/1500/107 -f 938/1490/107 942/1494/107 941/1502/107 -f 935/1503/107 939/1492/107 942/1504/107 -f 935/1498/112 943/1741/112 944/1506/112 -f 938/1505/110 946/1742/110 943/1507/110 -f 936/1501/109 944/1743/109 945/1508/109 -f 948/1509/109 950/1515/109 949/1510/109 -f 953/1512/111 961/1744/111 962/1513/111 -f 950/1515/108 958/1528/108 955/1516/108 -f 947/1511/107 956/1524/107 957/1517/107 -f 948/1509/111 957/1526/111 958/1518/111 -f 949/1510/112 955/1521/112 956/1519/112 -f 952/1520/110 956/1519/110 955/1521/110 -f 953/1523/110 957/1517/110 956/1524/110 -f 954/1514/110 958/1518/110 957/1526/110 -f 951/1527/110 955/1516/110 958/1528/110 -f 951/1522/112 959/1745/112 960/1530/112 -f 954/1529/108 962/1746/108 959/1531/108 -f 952/1525/107 960/1747/107 961/1532/107 -f 964/1533/109 966/1539/109 965/1534/109 -f 969/1536/111 977/1748/111 978/1537/111 -f 966/1539/108 974/1552/108 971/1540/108 -f 963/1535/107 972/1548/107 973/1541/107 -f 964/1533/111 973/1550/111 974/1542/111 -f 965/1534/112 971/1545/112 972/1543/112 -f 968/1544/110 972/1543/110 971/1545/110 -f 969/1547/110 973/1541/110 972/1548/110 -f 970/1538/110 974/1542/110 973/1550/110 -f 967/1551/110 971/1540/110 974/1552/110 -f 967/1546/112 975/1749/112 976/1554/112 -f 970/1553/108 978/1750/108 975/1555/108 -f 968/1549/107 976/1751/107 977/1556/107 -f 980/1557/109 982/1563/109 981/1558/109 -f 985/1560/111 993/1752/111 994/1561/111 -f 982/1563/108 990/1576/108 987/1564/108 -f 979/1559/107 988/1572/107 989/1565/107 -f 980/1557/111 989/1574/111 990/1566/111 -f 981/1558/112 987/1569/112 988/1567/112 -f 984/1568/110 988/1567/110 987/1569/110 -f 985/1571/110 989/1565/110 988/1572/110 -f 986/1562/110 990/1566/110 989/1574/110 -f 983/1575/110 987/1564/110 990/1576/110 -f 984/1568/112 983/1570/112 991/1578/112 -f 986/1577/108 994/1753/108 991/1580/108 -f 984/1573/107 992/1754/107 993/1581/107 -f 996/1582/110 998/1588/110 997/1583/110 -f 1001/1585/111 1009/1755/111 1010/1586/111 -f 998/1588/107 1006/1601/107 1003/1589/107 -f 995/1584/108 1004/1597/108 1005/1590/108 -f 996/1582/111 1005/1599/111 1006/1591/111 -f 997/1583/112 1003/1594/112 1004/1592/112 -f 1000/1593/109 1004/1592/109 1003/1594/109 -f 1001/1596/109 1005/1590/109 1004/1597/109 -f 1002/1587/109 1006/1591/109 1005/1599/109 -f 999/1600/109 1003/1589/109 1006/1601/109 -f 1000/1593/112 999/1595/112 1007/1603/112 -f 1002/1602/107 1010/1756/107 1007/1605/107 -f 1000/1598/108 1008/1757/108 1009/1606/108 -f 1012/1607/110 1014/1613/110 1013/1608/110 -f 1017/1610/111 1025/1758/111 1026/1611/111 -f 1014/1613/107 1022/1626/107 1019/1614/107 -f 1011/1609/108 1020/1622/108 1021/1615/108 -f 1012/1607/111 1021/1624/111 1022/1616/111 -f 1013/1608/112 1019/1619/112 1020/1617/112 -f 1016/1618/109 1020/1617/109 1019/1619/109 -f 1017/1621/109 1021/1615/109 1020/1622/109 -f 1018/1612/109 1022/1616/109 1021/1624/109 -f 1015/1625/109 1019/1614/109 1022/1626/109 -f 1015/1620/112 1023/1759/112 1024/1628/112 -f 1018/1627/107 1026/1760/107 1023/1629/107 -f 1016/1623/108 1024/1761/108 1025/1630/108 -f 1028/1631/110 1030/1637/110 1029/1632/110 -f 1033/1634/111 1041/1762/111 1042/1635/111 -f 1030/1637/107 1038/1650/107 1035/1638/107 -f 1027/1633/108 1036/1646/108 1037/1639/108 -f 1028/1631/111 1037/1648/111 1038/1640/111 -f 1027/1633/112 1029/1632/112 1035/1641/112 -f 1032/1643/109 1036/1642/109 1035/1641/109 -f 1033/1645/109 1037/1639/109 1036/1646/109 -f 1034/1636/109 1038/1640/109 1037/1648/109 -f 1031/1649/109 1035/1638/109 1038/1650/109 -f 1032/1643/112 1031/1644/112 1039/1652/112 -f 1034/1651/107 1042/1763/107 1039/1654/107 -f 1032/1647/108 1040/1764/108 1041/1655/108 +f 812/1330/113 816/1332/113 811/1331/113 +f 813/1335/114 818/1333/114 814/1336/114 +f 821/1337/111 820/1338/111 819/1339/111 +f 824/1340/112 826/1341/112 823/1342/112 +f 820/1338/115 824/1340/115 819/1339/115 +f 821/1343/116 826/1341/116 822/1344/116 +f 828/1345/112 848/1346/112 845/1347/112 +f 857/1348/108 856/1349/108 858/1350/108 +f 846/1351/111 849/1352/111 827/1353/111 +f 854/1354/111 857/1348/111 851/1355/111 +f 849/1352/107 848/1346/107 850/1356/107 +f 838/1357/107 836/1358/107 834/1359/107 +f 852/1360/112 856/1349/112 853/1361/112 +f 835/1362/108 839/1363/108 843/1364/108 +f 792/1365/117 860/1277/117 794/1366/117 +f 794/1367/118 861/1368/118 793/1369/118 +f 793/1278/119 862/1274/119 791/1370/119 +f 791/1371/120 859/1272/120 792/1372/120 +f 775/1373/120 864/1290/120 776/1374/120 +f 777/1281/119 863/1288/119 775/1375/119 +f 778/1376/118 865/1377/118 777/1378/118 +f 776/1379/117 866/1285/117 778/1380/117 +f 781/1381/117 868/1299/117 779/1382/117 +f 779/1383/118 869/1384/118 780/1385/118 +f 780/1300/119 870/1297/119 782/1386/119 +f 782/1387/120 867/1295/120 781/1388/120 +f 797/1389/117 872/1307/117 795/1390/117 +f 795/1391/118 873/1392/118 796/1393/118 +f 796/1308/119 874/1305/119 798/1394/119 +f 798/1395/120 871/1266/120 797/1396/120 +f 876/1397/107 877/1398/107 875/1399/107 +f 881/1400/111 890/1401/111 882/1402/111 +f 878/1403/109 883/1404/109 877/1398/109 +f 875/1399/110 885/1405/110 876/1397/110 +f 876/1397/111 886/1406/111 878/1403/111 +f 877/1398/112 884/1407/112 875/1399/112 +f 880/1408/108 883/1409/108 879/1410/108 +f 881/1411/108 884/1412/108 880/1413/108 +f 882/1402/108 885/1414/108 881/1400/108 +f 879/1415/108 886/1416/108 882/1417/108 +f 879/1410/112 888/1418/112 880/1408/112 +f 882/1417/109 887/1419/109 879/1415/109 +f 880/1413/110 889/1420/110 881/1411/110 +f 892/1421/107 893/1422/107 891/1423/107 +f 897/1424/111 906/1425/111 898/1426/111 +f 894/1427/109 899/1428/109 893/1422/109 +f 891/1423/110 901/1429/110 892/1421/110 +f 892/1421/111 902/1430/111 894/1427/111 +f 893/1422/112 900/1431/112 891/1423/112 +f 896/1432/108 899/1433/108 895/1434/108 +f 897/1435/108 900/1436/108 896/1437/108 +f 898/1426/108 901/1438/108 897/1424/108 +f 895/1439/108 902/1440/108 898/1441/108 +f 895/1434/112 904/1442/112 896/1432/112 +f 898/1441/109 903/1443/109 895/1439/109 +f 896/1437/110 905/1444/110 897/1435/110 +f 908/1445/108 909/1446/108 907/1447/108 +f 913/1448/111 922/1449/111 914/1450/111 +f 910/1451/110 915/1452/110 909/1446/110 +f 907/1447/109 917/1453/109 908/1445/109 +f 908/1445/111 918/1454/111 910/1451/111 +f 909/1446/112 916/1455/112 907/1447/112 +f 912/1456/107 915/1457/107 911/1458/107 +f 913/1459/107 916/1460/107 912/1461/107 +f 914/1450/107 917/1462/107 913/1448/107 +f 911/1463/107 918/1464/107 914/1465/107 +f 911/1458/112 920/1466/112 912/1456/112 +f 914/1465/110 919/1467/110 911/1463/110 +f 912/1461/109 921/1468/109 913/1459/109 +f 924/1469/108 925/1470/108 923/1471/108 +f 929/1472/111 938/1473/111 930/1474/111 +f 926/1475/110 931/1476/110 925/1470/110 +f 923/1471/109 933/1477/109 924/1469/109 +f 924/1469/111 934/1478/111 926/1475/111 +f 925/1470/112 932/1479/112 923/1471/112 +f 928/1480/107 931/1481/107 927/1482/107 +f 929/1483/107 932/1484/107 928/1485/107 +f 930/1474/107 933/1486/107 929/1472/107 +f 927/1487/107 934/1488/107 930/1489/107 +f 927/1482/112 936/1490/112 928/1480/112 +f 930/1489/110 935/1491/110 927/1487/110 +f 928/1485/109 937/1492/109 929/1483/109 +f 940/1493/108 941/1494/108 939/1495/108 +f 945/1496/111 954/1497/111 946/1498/111 +f 942/1499/110 947/1500/110 941/1494/110 +f 939/1495/109 949/1501/109 940/1493/109 +f 940/1493/111 950/1502/111 942/1499/111 +f 941/1494/112 948/1503/112 939/1495/112 +f 944/1504/107 947/1505/107 943/1506/107 +f 945/1507/107 948/1508/107 944/1509/107 +f 946/1498/107 949/1510/107 945/1496/107 +f 943/1511/107 950/1512/107 946/1513/107 +f 943/1506/112 952/1514/112 944/1504/112 +f 946/1513/110 951/1515/110 943/1511/110 +f 944/1509/109 953/1516/109 945/1507/109 +f 956/1517/109 957/1518/109 955/1519/109 +f 961/1520/111 970/1521/111 962/1522/111 +f 958/1523/108 963/1524/108 957/1518/108 +f 955/1519/107 965/1525/107 956/1517/107 +f 956/1517/111 966/1526/111 958/1523/111 +f 957/1518/112 964/1527/112 955/1519/112 +f 960/1528/110 963/1529/110 959/1530/110 +f 961/1531/110 964/1532/110 960/1533/110 +f 962/1522/110 965/1534/110 961/1520/110 +f 959/1535/110 966/1536/110 962/1537/110 +f 959/1530/112 968/1538/112 960/1528/112 +f 962/1537/108 967/1539/108 959/1535/108 +f 960/1533/107 969/1540/107 961/1531/107 +f 972/1541/109 973/1542/109 971/1543/109 +f 977/1544/111 986/1545/111 978/1546/111 +f 974/1547/108 979/1548/108 973/1542/108 +f 971/1543/107 981/1549/107 972/1541/107 +f 972/1541/111 982/1550/111 974/1547/111 +f 973/1542/112 980/1551/112 971/1543/112 +f 976/1552/110 979/1553/110 975/1554/110 +f 977/1555/110 980/1556/110 976/1557/110 +f 978/1546/110 981/1558/110 977/1544/110 +f 975/1559/110 982/1560/110 978/1561/110 +f 975/1554/112 984/1562/112 976/1552/112 +f 978/1561/108 983/1563/108 975/1559/108 +f 976/1557/107 985/1564/107 977/1555/107 +f 988/1565/109 989/1566/109 987/1567/109 +f 993/1568/111 1002/1569/111 994/1570/111 +f 990/1571/108 995/1572/108 989/1566/108 +f 987/1567/107 997/1573/107 988/1565/107 +f 988/1565/111 998/1574/111 990/1571/111 +f 989/1566/112 996/1575/112 987/1567/112 +f 992/1576/110 995/1577/110 991/1578/110 +f 993/1579/110 996/1580/110 992/1581/110 +f 994/1570/110 997/1582/110 993/1568/110 +f 991/1583/110 998/1584/110 994/1585/110 +f 992/1576/112 999/1586/112 1000/1587/112 +f 994/1585/108 999/1588/108 991/1583/108 +f 992/1581/107 1001/1589/107 993/1579/107 +f 1004/1590/110 1005/1591/110 1003/1592/110 +f 1009/1593/111 1018/1594/111 1010/1595/111 +f 1006/1596/107 1011/1597/107 1005/1591/107 +f 1003/1592/108 1013/1598/108 1004/1590/108 +f 1004/1590/111 1014/1599/111 1006/1596/111 +f 1005/1591/112 1012/1600/112 1003/1592/112 +f 1008/1601/109 1011/1602/109 1007/1603/109 +f 1009/1604/109 1012/1605/109 1008/1606/109 +f 1010/1595/109 1013/1607/109 1009/1593/109 +f 1007/1608/109 1014/1609/109 1010/1610/109 +f 1008/1601/112 1015/1611/112 1016/1612/112 +f 1010/1610/107 1015/1613/107 1007/1608/107 +f 1008/1606/108 1017/1614/108 1009/1604/108 +f 1020/1615/110 1021/1616/110 1019/1617/110 +f 1025/1618/111 1034/1619/111 1026/1620/111 +f 1022/1621/107 1027/1622/107 1021/1616/107 +f 1019/1617/108 1029/1623/108 1020/1615/108 +f 1020/1615/111 1030/1624/111 1022/1621/111 +f 1021/1616/112 1028/1625/112 1019/1617/112 +f 1024/1626/109 1027/1627/109 1023/1628/109 +f 1025/1629/109 1028/1630/109 1024/1631/109 +f 1026/1620/109 1029/1632/109 1025/1618/109 +f 1023/1633/109 1030/1634/109 1026/1635/109 +f 1023/1628/112 1032/1636/112 1024/1626/112 +f 1026/1635/107 1031/1637/107 1023/1633/107 +f 1024/1631/108 1033/1638/108 1025/1629/108 +f 1036/1639/110 1037/1640/110 1035/1641/110 +f 1041/1642/111 1050/1643/111 1042/1644/111 +f 1038/1645/107 1043/1646/107 1037/1640/107 +f 1035/1641/108 1045/1647/108 1036/1639/108 +f 1036/1639/111 1046/1648/111 1038/1645/111 +f 1035/1641/112 1043/1649/112 1044/1650/112 +f 1040/1651/109 1043/1649/109 1039/1652/109 +f 1041/1653/109 1044/1654/109 1040/1655/109 +f 1042/1644/109 1045/1656/109 1041/1642/109 +f 1039/1657/109 1046/1658/109 1042/1659/109 +f 1040/1651/112 1047/1660/112 1048/1661/112 +f 1042/1659/107 1047/1662/107 1039/1657/107 +f 1040/1655/108 1049/1663/108 1041/1653/108 +f 574/997/107 571/1053/107 572/998/107 +f 576/1000/108 578/1003/108 577/1001/108 +f 578/1003/109 582/1005/109 581/1004/109 +f 582/1005/107 580/1012/107 579/1006/107 +f 580/1007/110 576/1000/110 575/1002/110 +f 581/1004/111 579/1006/111 575/1009/111 +f 578/1011/112 576/1664/112 580/1012/112 +f 584/1013/108 586/1016/108 585/1014/108 +f 586/1016/109 590/1018/109 589/1017/109 +f 590/1018/107 588/1025/107 587/1019/107 +f 588/1020/110 584/1013/110 583/1015/110 +f 589/1017/111 587/1019/111 583/1022/111 +f 586/1024/112 584/1665/112 588/1025/112 +f 592/1026/108 594/1029/108 593/1027/108 +f 594/1029/109 598/1031/109 597/1030/109 +f 598/1031/107 596/1038/107 595/1032/107 +f 596/1033/110 592/1026/110 591/1028/110 +f 597/1030/111 595/1032/111 591/1035/111 +f 594/1037/112 592/1666/112 596/1038/112 +f 600/1039/108 602/1042/108 601/1040/108 +f 602/1042/109 606/1044/109 605/1043/109 +f 606/1044/107 604/1051/107 603/1045/107 +f 604/1046/110 600/1039/110 599/1041/110 +f 605/1043/111 603/1045/111 599/1048/111 +f 602/1050/112 600/1667/112 604/1051/112 +f 573/999/111 609/1668/111 610/1052/111 +f 571/1053/112 607/1669/112 608/1054/112 +f 610/1052/108 609/1668/108 608/1055/108 +f 614/1057/107 611/1670/107 612/1058/107 +f 613/1059/111 617/1671/111 618/1060/111 +f 611/1061/112 615/1064/112 616/1062/112 +f 618/1060/108 617/1671/108 616/1062/108 +f 622/1065/109 619/1069/109 620/1066/109 +f 621/1067/111 625/1672/111 626/1068/111 +f 619/1069/112 623/1673/112 624/1070/112 +f 626/1068/110 625/1672/110 624/1071/110 +f 630/1073/109 627/1674/109 628/1074/109 +f 629/1075/111 633/1675/111 634/1076/111 +f 627/1077/112 631/1080/112 632/1078/112 +f 634/1076/110 633/1675/110 632/1078/110 +f 636/1081/107 638/1087/107 637/1082/107 +f 641/1084/111 649/1676/111 650/1085/111 +f 638/1087/109 646/1100/109 643/1088/109 +f 635/1083/110 644/1096/110 645/1089/110 +f 636/1081/111 645/1098/111 646/1090/111 +f 637/1082/112 643/1093/112 644/1091/112 +f 640/1092/108 644/1091/108 643/1093/108 +f 641/1095/108 645/1089/108 644/1096/108 +f 642/1086/108 646/1090/108 645/1098/108 +f 639/1099/108 643/1088/108 646/1100/108 +f 639/1094/112 647/1677/112 648/1102/112 +f 642/1101/109 650/1678/109 647/1103/109 +f 640/1097/110 648/1679/110 649/1104/110 +f 653/1105/111 654/1680/111 652/1106/111 +f 657/1108/112 658/1112/112 655/1109/112 +f 653/1111/108 655/1109/108 658/1112/108 +f 652/1106/107 657/1108/107 656/1110/107 +f 654/1114/109 658/1112/109 657/1108/109 +f 651/1116/110 656/1110/110 655/1109/110 +f 661/1118/111 662/1681/111 660/1119/111 +f 665/1121/112 666/1125/112 663/1122/112 +f 661/1124/108 663/1122/108 666/1125/108 +f 660/1119/107 665/1121/107 664/1123/107 +f 662/1127/109 666/1125/109 665/1121/109 +f 659/1129/110 664/1123/110 663/1122/110 +f 669/1131/111 670/1682/111 668/1132/111 +f 673/1134/112 674/1138/112 671/1135/112 +f 669/1137/108 671/1135/108 674/1138/108 +f 668/1132/107 673/1134/107 672/1136/107 +f 670/1140/109 674/1138/109 673/1134/109 +f 667/1142/110 672/1136/110 671/1135/110 +f 675/1144/111 683/1156/111 684/1145/111 +f 681/1147/112 686/1683/112 685/1148/112 +f 676/1146/107 684/1145/107 686/1150/107 +f 677/1152/109 679/1176/109 682/1153/109 +f 676/1146/110 681/1684/110 680/1155/110 +f 685/1148/109 686/1683/109 684/1145/109 +f 680/1157/108 685/1685/108 683/1156/108 +f 688/1158/109 690/1169/109 689/1159/109 +f 694/1161/110 693/1168/110 691/1162/110 +f 689/1164/111 694/1170/111 692/1165/111 +f 687/1167/108 692/1686/108 691/1162/108 +f 688/1158/112 691/1162/112 693/1168/112 +f 690/1169/107 693/1168/107 694/1170/107 +f 697/1171/110 698/1175/110 696/1172/110 +f 677/1174/108 696/1687/108 698/1175/108 +f 679/1176/112 698/1175/112 697/1171/112 +f 678/1177/111 695/1180/111 696/1178/111 +f 682/1153/107 697/1171/107 695/1180/107 +f 708/1181/112 709/1218/112 725/1182/112 +f 707/1184/112 708/1181/112 724/1185/112 +f 706/1187/112 707/1184/112 723/1188/112 +f 705/1190/112 706/1187/112 722/1191/112 +f 704/1193/112 705/1190/112 721/1194/112 +f 703/1196/112 704/1193/112 720/1197/112 +f 703/1199/112 719/1688/112 718/1200/112 +f 702/1201/112 718/1689/112 717/1202/112 +f 701/1203/112 717/1690/112 716/1204/112 +f 700/1205/112 716/1691/112 715/1206/112 +f 699/1207/112 715/1692/112 730/1208/112 +f 714/1209/112 730/1693/112 729/1210/112 +f 713/1211/112 729/1694/112 728/1212/112 +f 712/1213/112 728/1695/112 727/1214/112 +f 711/1215/112 727/1696/112 726/1216/112 +f 709/1218/112 710/1217/112 726/1219/112 +f 740/1221/111 756/1697/111 757/1222/111 +f 739/1224/111 755/1698/111 756/1225/111 +f 738/1226/111 754/1699/111 755/1227/111 +f 737/1228/111 753/1700/111 754/1229/111 +f 736/1230/111 752/1701/111 753/1231/111 +f 735/1232/111 751/1702/111 752/1233/111 +f 750/1234/111 751/1703/111 735/1235/111 +f 749/1237/111 750/1704/111 734/1236/111 +f 747/1239/111 749/1705/111 733/1238/111 +f 748/1241/111 747/1706/111 731/1240/111 +f 762/1243/111 748/1707/111 732/1242/111 +f 761/1245/111 762/1708/111 746/1244/111 +f 760/1247/111 761/1709/111 745/1246/111 +f 759/1249/111 760/1710/111 744/1248/111 +f 758/1251/111 759/1711/111 743/1250/111 +f 741/1223/111 757/1712/111 758/1253/111 +f 764/1254/112 766/1261/112 765/1255/112 +f 769/1257/107 809/1324/107 810/1258/107 +f 765/1255/108 803/1314/108 804/1260/108 +f 766/1261/109 806/1321/109 803/1262/109 +f 763/1256/110 804/1317/110 805/1263/110 +f 764/1254/107 805/1319/107 806/1264/107 +f 802/1265/108 872/1307/108 871/1266/108 +f 799/1268/107 874/1305/107 873/1269/107 +f 787/1271/108 860/1277/108 859/1272/108 +f 789/1273/109 859/1272/109 862/1274/109 +f 788/1276/110 861/1368/110 860/1277/110 +f 793/1278/112 791/1370/112 792/1279/112 +f 777/1281/112 775/1375/112 776/1282/112 +f 772/1284/110 865/1377/110 866/1285/110 +f 773/1287/109 864/1290/109 863/1288/109 +f 771/1286/108 866/1285/108 864/1290/108 +f 783/1291/107 870/1297/107 869/1292/107 +f 786/1294/108 868/1299/108 867/1295/108 +f 784/1296/109 867/1295/109 870/1297/109 +f 785/1298/110 869/1384/110 868/1299/110 +f 780/1300/112 782/1386/112 781/1301/112 +f 774/1289/107 863/1288/107 865/1303/107 +f 800/1267/109 871/1266/109 874/1305/109 +f 801/1306/110 873/1392/110 872/1307/110 +f 796/1308/112 798/1394/112 797/1309/112 +f 790/1275/107 862/1274/107 861/1311/107 +f 768/1313/111 804/1260/111 803/1314/111 +f 769/1316/111 805/1263/111 804/1317/111 +f 770/1259/111 806/1264/111 805/1319/111 +f 767/1320/111 803/1262/111 806/1321/111 +f 807/1323/111 810/1258/111 809/1324/111 +f 767/1315/108 807/1713/108 808/1326/108 +f 770/1322/109 810/1714/109 807/1327/109 +f 768/1318/110 808/1715/110 809/1328/110 +f 813/1329/111 814/1716/111 812/1330/111 +f 816/1332/112 817/1717/112 818/1333/112 +f 812/1330/113 817/1717/113 816/1332/113 +f 813/1335/114 815/1334/114 818/1333/114 +f 821/1337/111 822/1718/111 820/1338/111 +f 824/1340/112 825/1719/112 826/1341/112 +f 820/1338/115 825/1719/115 824/1340/115 +f 821/1343/116 823/1342/116 826/1341/116 +f 828/1345/112 850/1356/112 848/1346/112 +f 857/1348/108 855/1720/108 856/1349/108 +f 846/1351/111 847/1721/111 849/1352/111 +f 854/1354/111 855/1720/111 857/1348/111 +f 849/1352/107 847/1721/107 848/1346/107 +f 834/1359/107 832/1722/107 830/1723/107 +f 830/1723/107 844/1724/107 834/1359/107 +f 844/1724/107 842/1725/107 834/1359/107 +f 842/1725/107 840/1726/107 834/1359/107 +f 840/1726/107 838/1357/107 834/1359/107 +f 852/1360/112 858/1350/112 856/1349/112 +f 843/1364/108 829/1727/108 831/1728/108 +f 831/1728/108 833/1729/108 835/1362/108 +f 835/1362/108 837/1730/108 839/1363/108 +f 839/1363/108 841/1731/108 843/1364/108 +f 843/1364/108 831/1728/108 835/1362/108 +f 792/1365/117 859/1272/117 860/1277/117 +f 794/1367/118 860/1277/118 861/1368/118 +f 793/1278/119 861/1311/119 862/1274/119 +f 791/1371/120 862/1274/120 859/1272/120 +f 775/1373/120 863/1288/120 864/1290/120 +f 777/1281/119 865/1303/119 863/1288/119 +f 778/1376/118 866/1285/118 865/1377/118 +f 776/1379/117 864/1290/117 866/1285/117 +f 781/1381/117 867/1295/117 868/1299/117 +f 779/1383/118 868/1299/118 869/1384/118 +f 780/1300/119 869/1292/119 870/1297/119 +f 782/1387/120 870/1297/120 867/1295/120 +f 797/1389/117 871/1266/117 872/1307/117 +f 795/1391/118 872/1307/118 873/1392/118 +f 796/1308/119 873/1269/119 874/1305/119 +f 798/1395/120 874/1305/120 871/1266/120 +f 876/1397/107 878/1403/107 877/1398/107 +f 881/1400/111 889/1732/111 890/1401/111 +f 878/1403/109 886/1416/109 883/1404/109 +f 875/1399/110 884/1412/110 885/1405/110 +f 876/1397/111 885/1414/111 886/1406/111 +f 877/1398/112 883/1409/112 884/1407/112 +f 880/1408/108 884/1407/108 883/1409/108 +f 881/1411/108 885/1405/108 884/1412/108 +f 882/1402/108 886/1406/108 885/1414/108 +f 879/1415/108 883/1404/108 886/1416/108 +f 879/1410/112 887/1733/112 888/1418/112 +f 882/1417/109 890/1734/109 887/1419/109 +f 880/1413/110 888/1735/110 889/1420/110 +f 892/1421/107 894/1427/107 893/1422/107 +f 897/1424/111 905/1736/111 906/1425/111 +f 894/1427/109 902/1440/109 899/1428/109 +f 891/1423/110 900/1436/110 901/1429/110 +f 892/1421/111 901/1438/111 902/1430/111 +f 893/1422/112 899/1433/112 900/1431/112 +f 896/1432/108 900/1431/108 899/1433/108 +f 897/1435/108 901/1429/108 900/1436/108 +f 898/1426/108 902/1430/108 901/1438/108 +f 895/1439/108 899/1428/108 902/1440/108 +f 895/1434/112 903/1737/112 904/1442/112 +f 898/1441/109 906/1738/109 903/1443/109 +f 896/1437/110 904/1739/110 905/1444/110 +f 908/1445/108 910/1451/108 909/1446/108 +f 913/1448/111 921/1740/111 922/1449/111 +f 910/1451/110 918/1464/110 915/1452/110 +f 907/1447/109 916/1460/109 917/1453/109 +f 908/1445/111 917/1462/111 918/1454/111 +f 909/1446/112 915/1457/112 916/1455/112 +f 912/1456/107 916/1455/107 915/1457/107 +f 913/1459/107 917/1453/107 916/1460/107 +f 914/1450/107 918/1454/107 917/1462/107 +f 911/1463/107 915/1452/107 918/1464/107 +f 911/1458/112 919/1741/112 920/1466/112 +f 914/1465/110 922/1742/110 919/1467/110 +f 912/1461/109 920/1743/109 921/1468/109 +f 924/1469/108 926/1475/108 925/1470/108 +f 929/1472/111 937/1744/111 938/1473/111 +f 926/1475/110 934/1488/110 931/1476/110 +f 923/1471/109 932/1484/109 933/1477/109 +f 924/1469/111 933/1486/111 934/1478/111 +f 925/1470/112 931/1481/112 932/1479/112 +f 928/1480/107 932/1479/107 931/1481/107 +f 929/1483/107 933/1477/107 932/1484/107 +f 930/1474/107 934/1478/107 933/1486/107 +f 927/1487/107 931/1476/107 934/1488/107 +f 927/1482/112 935/1745/112 936/1490/112 +f 930/1489/110 938/1746/110 935/1491/110 +f 928/1485/109 936/1747/109 937/1492/109 +f 940/1493/108 942/1499/108 941/1494/108 +f 945/1496/111 953/1748/111 954/1497/111 +f 942/1499/110 950/1512/110 947/1500/110 +f 939/1495/109 948/1508/109 949/1501/109 +f 940/1493/111 949/1510/111 950/1502/111 +f 941/1494/112 947/1505/112 948/1503/112 +f 944/1504/107 948/1503/107 947/1505/107 +f 945/1507/107 949/1501/107 948/1508/107 +f 946/1498/107 950/1502/107 949/1510/107 +f 943/1511/107 947/1500/107 950/1512/107 +f 943/1506/112 951/1749/112 952/1514/112 +f 946/1513/110 954/1750/110 951/1515/110 +f 944/1509/109 952/1751/109 953/1516/109 +f 956/1517/109 958/1523/109 957/1518/109 +f 961/1520/111 969/1752/111 970/1521/111 +f 958/1523/108 966/1536/108 963/1524/108 +f 955/1519/107 964/1532/107 965/1525/107 +f 956/1517/111 965/1534/111 966/1526/111 +f 957/1518/112 963/1529/112 964/1527/112 +f 960/1528/110 964/1527/110 963/1529/110 +f 961/1531/110 965/1525/110 964/1532/110 +f 962/1522/110 966/1526/110 965/1534/110 +f 959/1535/110 963/1524/110 966/1536/110 +f 959/1530/112 967/1753/112 968/1538/112 +f 962/1537/108 970/1754/108 967/1539/108 +f 960/1533/107 968/1755/107 969/1540/107 +f 972/1541/109 974/1547/109 973/1542/109 +f 977/1544/111 985/1756/111 986/1545/111 +f 974/1547/108 982/1560/108 979/1548/108 +f 971/1543/107 980/1556/107 981/1549/107 +f 972/1541/111 981/1558/111 982/1550/111 +f 973/1542/112 979/1553/112 980/1551/112 +f 976/1552/110 980/1551/110 979/1553/110 +f 977/1555/110 981/1549/110 980/1556/110 +f 978/1546/110 982/1550/110 981/1558/110 +f 975/1559/110 979/1548/110 982/1560/110 +f 975/1554/112 983/1757/112 984/1562/112 +f 978/1561/108 986/1758/108 983/1563/108 +f 976/1557/107 984/1759/107 985/1564/107 +f 988/1565/109 990/1571/109 989/1566/109 +f 993/1568/111 1001/1760/111 1002/1569/111 +f 990/1571/108 998/1584/108 995/1572/108 +f 987/1567/107 996/1580/107 997/1573/107 +f 988/1565/111 997/1582/111 998/1574/111 +f 989/1566/112 995/1577/112 996/1575/112 +f 992/1576/110 996/1575/110 995/1577/110 +f 993/1579/110 997/1573/110 996/1580/110 +f 994/1570/110 998/1574/110 997/1582/110 +f 991/1583/110 995/1572/110 998/1584/110 +f 992/1576/112 991/1578/112 999/1586/112 +f 994/1585/108 1002/1761/108 999/1588/108 +f 992/1581/107 1000/1762/107 1001/1589/107 +f 1004/1590/110 1006/1596/110 1005/1591/110 +f 1009/1593/111 1017/1763/111 1018/1594/111 +f 1006/1596/107 1014/1609/107 1011/1597/107 +f 1003/1592/108 1012/1605/108 1013/1598/108 +f 1004/1590/111 1013/1607/111 1014/1599/111 +f 1005/1591/112 1011/1602/112 1012/1600/112 +f 1008/1601/109 1012/1600/109 1011/1602/109 +f 1009/1604/109 1013/1598/109 1012/1605/109 +f 1010/1595/109 1014/1599/109 1013/1607/109 +f 1007/1608/109 1011/1597/109 1014/1609/109 +f 1008/1601/112 1007/1603/112 1015/1611/112 +f 1010/1610/107 1018/1764/107 1015/1613/107 +f 1008/1606/108 1016/1765/108 1017/1614/108 +f 1020/1615/110 1022/1621/110 1021/1616/110 +f 1025/1618/111 1033/1766/111 1034/1619/111 +f 1022/1621/107 1030/1634/107 1027/1622/107 +f 1019/1617/108 1028/1630/108 1029/1623/108 +f 1020/1615/111 1029/1632/111 1030/1624/111 +f 1021/1616/112 1027/1627/112 1028/1625/112 +f 1024/1626/109 1028/1625/109 1027/1627/109 +f 1025/1629/109 1029/1623/109 1028/1630/109 +f 1026/1620/109 1030/1624/109 1029/1632/109 +f 1023/1633/109 1027/1622/109 1030/1634/109 +f 1023/1628/112 1031/1767/112 1032/1636/112 +f 1026/1635/107 1034/1768/107 1031/1637/107 +f 1024/1631/108 1032/1769/108 1033/1638/108 +f 1036/1639/110 1038/1645/110 1037/1640/110 +f 1041/1642/111 1049/1770/111 1050/1643/111 +f 1038/1645/107 1046/1658/107 1043/1646/107 +f 1035/1641/108 1044/1654/108 1045/1647/108 +f 1036/1639/111 1045/1656/111 1046/1648/111 +f 1035/1641/112 1037/1640/112 1043/1649/112 +f 1040/1651/109 1044/1650/109 1043/1649/109 +f 1041/1653/109 1045/1647/109 1044/1654/109 +f 1042/1644/109 1046/1648/109 1045/1656/109 +f 1039/1657/109 1043/1646/109 1046/1658/109 +f 1040/1651/112 1039/1652/112 1047/1660/112 +f 1042/1659/107 1050/1771/107 1047/1662/107 +f 1040/1655/108 1048/1772/108 1049/1663/108 s 1 -f 698/1179/121 731/1216/110 699/1176/110 -f 713/1186/115 744/1765/122 712/1187/122 -f 699/1176/110 732/1213/123 700/1173/123 -f 714/1183/124 745/1766/115 713/1184/115 -f 700/1173/123 733/1215/113 701/1210/113 -f 715/1180/109 746/1767/124 714/1181/124 -f 701/1210/113 734/1244/125 702/1209/125 -f 716/1177/126 747/1768/109 715/1178/109 -f 702/1209/125 735/1242/107 703/1207/107 -f 717/1174/114 748/1769/126 716/1175/126 -f 703/1207/107 736/1240/122 704/1205/122 -f 718/1211/127 749/1770/114 717/1212/114 -f 704/1205/122 737/1238/115 705/1203/115 -f 691/1199/109 723/1232/126 692/1197/126 -f 719/1688/108 750/1771/127 718/1208/127 -f 705/1203/115 738/1236/124 706/1201/124 -f 692/1197/126 725/1230/114 693/1195/114 -f 720/1687/128 751/1772/108 719/1206/108 -f 706/1201/124 724/1234/109 691/1199/109 -f 693/1195/114 726/1228/127 694/1193/127 -f 721/1686/116 752/1773/128 720/1204/128 -f 708/1683/123 740/1774/110 707/1198/110 -f 694/1193/127 727/1227/108 695/1191/108 -f 722/1685/121 753/1775/116 721/1202/116 -f 709/1682/113 739/1776/123 708/1196/123 -f 695/1188/108 728/1222/128 696/1185/128 -f 707/1684/110 754/1777/121 722/1200/121 -f 710/1681/125 741/1778/113 709/1194/113 -f 696/1185/128 729/1220/116 697/1182/116 -f 711/1680/107 742/1779/125 710/1192/125 -f 697/1182/116 730/1218/121 698/1179/121 -f 712/1189/122 743/1780/107 711/1190/107 -f 822/1781/109 823/1782/129 821/1783/109 -f 824/1784/129 825/1785/111 823/1782/129 -f 826/1786/111 827/1787/130 825/1788/111 -f 828/1789/130 829/1790/110 827/1787/130 -f 830/1791/110 831/1792/118 829/1790/110 -f 832/1793/118 833/1794/112 831/1792/118 -f 834/1795/112 835/1796/120 833/1794/112 -f 836/1797/120 821/1783/109 835/1796/120 -f 698/1179/121 730/1218/121 731/1216/110 -f 713/1186/115 745/1798/115 744/1765/122 -f 699/1176/110 731/1216/110 732/1213/123 -f 714/1183/124 746/1799/124 745/1766/115 -f 700/1173/123 732/1213/123 733/1215/113 -f 715/1180/109 747/1800/109 746/1767/124 -f 701/1210/113 733/1215/113 734/1244/125 -f 716/1177/126 748/1801/126 747/1768/109 -f 702/1209/125 734/1244/125 735/1242/107 -f 717/1174/114 749/1802/114 748/1769/126 -f 703/1207/107 735/1242/107 736/1240/122 -f 718/1211/127 750/1803/127 749/1770/114 -f 704/1205/122 736/1240/122 737/1238/115 -f 691/1199/109 724/1234/109 723/1232/126 -f 719/1688/108 751/1804/108 750/1771/127 -f 705/1203/115 737/1238/115 738/1236/124 -f 692/1197/126 723/1232/126 725/1230/114 -f 720/1687/128 752/1805/128 751/1772/108 -f 706/1201/124 738/1236/124 724/1234/109 -f 693/1195/114 725/1230/114 726/1228/127 -f 721/1686/116 753/1806/116 752/1773/128 -f 708/1683/123 739/1807/123 740/1774/110 -f 694/1193/127 726/1228/127 727/1227/108 -f 722/1685/121 754/1808/121 753/1775/116 -f 709/1682/113 741/1809/113 739/1776/123 -f 695/1188/108 727/1224/108 728/1222/128 -f 707/1684/110 740/1810/110 754/1777/121 -f 710/1681/125 742/1811/125 741/1778/113 -f 696/1185/128 728/1222/128 729/1220/116 -f 711/1680/107 743/1812/107 742/1779/125 -f 697/1182/116 729/1220/116 730/1218/121 -f 712/1189/122 744/1813/122 743/1780/107 -f 822/1781/109 824/1784/129 823/1782/129 -f 824/1784/129 826/1814/111 825/1785/111 -f 826/1786/111 828/1789/130 827/1787/130 -f 828/1789/130 830/1791/110 829/1790/110 -f 830/1791/110 832/1793/118 831/1792/118 -f 832/1793/118 834/1795/112 833/1794/112 -f 834/1795/112 836/1797/120 835/1796/120 -f 836/1797/120 822/1781/109 821/1783/109 +f 706/1187/121 739/1224/110 707/1184/110 +f 721/1194/115 752/1773/122 720/1195/122 +f 707/1184/110 740/1221/123 708/1181/123 +f 722/1191/124 753/1774/115 721/1192/115 +f 708/1181/123 741/1223/113 709/1218/113 +f 723/1188/109 754/1775/124 722/1189/124 +f 709/1218/113 742/1252/125 710/1217/125 +f 724/1185/126 755/1776/109 723/1186/109 +f 710/1217/125 743/1250/107 711/1215/107 +f 725/1182/114 756/1777/126 724/1183/126 +f 711/1215/107 744/1248/122 712/1213/122 +f 726/1219/127 757/1778/114 725/1220/114 +f 712/1213/122 745/1246/115 713/1211/115 +f 699/1207/109 731/1240/126 700/1205/126 +f 727/1696/108 758/1779/127 726/1216/127 +f 713/1211/115 746/1244/124 714/1209/124 +f 700/1205/126 733/1238/114 701/1203/114 +f 728/1695/128 759/1780/108 727/1214/108 +f 714/1209/124 732/1242/109 699/1207/109 +f 701/1203/114 734/1236/127 702/1201/127 +f 729/1694/116 760/1781/128 728/1212/128 +f 716/1691/123 748/1782/110 715/1206/110 +f 702/1201/127 735/1235/108 703/1199/108 +f 730/1693/121 761/1783/116 729/1210/116 +f 717/1690/113 747/1784/123 716/1204/123 +f 703/1196/108 736/1230/128 704/1193/128 +f 715/1692/110 762/1785/121 730/1208/121 +f 718/1689/125 749/1786/113 717/1202/113 +f 704/1193/128 737/1228/116 705/1190/116 +f 719/1688/107 750/1787/125 718/1200/125 +f 705/1190/116 738/1226/121 706/1187/121 +f 720/1197/122 751/1788/107 719/1198/107 +f 830/1789/109 831/1790/129 829/1791/109 +f 832/1792/129 833/1793/111 831/1790/129 +f 834/1794/111 835/1795/130 833/1796/111 +f 836/1797/130 837/1798/110 835/1795/130 +f 838/1799/110 839/1800/118 837/1798/110 +f 840/1801/118 841/1802/112 839/1800/118 +f 842/1803/112 843/1804/120 841/1802/112 +f 844/1805/120 829/1791/109 843/1804/120 +f 706/1187/121 738/1226/121 739/1224/110 +f 721/1194/115 753/1806/115 752/1773/122 +f 707/1184/110 739/1224/110 740/1221/123 +f 722/1191/124 754/1807/124 753/1774/115 +f 708/1181/123 740/1221/123 741/1223/113 +f 723/1188/109 755/1808/109 754/1775/124 +f 709/1218/113 741/1223/113 742/1252/125 +f 724/1185/126 756/1809/126 755/1776/109 +f 710/1217/125 742/1252/125 743/1250/107 +f 725/1182/114 757/1810/114 756/1777/126 +f 711/1215/107 743/1250/107 744/1248/122 +f 726/1219/127 758/1811/127 757/1778/114 +f 712/1213/122 744/1248/122 745/1246/115 +f 699/1207/109 732/1242/109 731/1240/126 +f 727/1696/108 759/1812/108 758/1779/127 +f 713/1211/115 745/1246/115 746/1244/124 +f 700/1205/126 731/1240/126 733/1238/114 +f 728/1695/128 760/1813/128 759/1780/108 +f 714/1209/124 746/1244/124 732/1242/109 +f 701/1203/114 733/1238/114 734/1236/127 +f 729/1694/116 761/1814/116 760/1781/128 +f 716/1691/123 747/1815/123 748/1782/110 +f 702/1201/127 734/1236/127 735/1235/108 +f 730/1693/121 762/1816/121 761/1783/116 +f 717/1690/113 749/1817/113 747/1784/123 +f 703/1196/108 735/1232/108 736/1230/128 +f 715/1692/110 748/1818/110 762/1785/121 +f 718/1689/125 750/1819/125 749/1786/113 +f 704/1193/128 736/1230/128 737/1228/116 +f 719/1688/107 751/1820/107 750/1787/125 +f 705/1190/116 737/1228/116 738/1226/121 +f 720/1197/122 752/1821/122 751/1788/107 +f 830/1789/109 832/1792/129 831/1790/129 +f 832/1792/129 834/1822/111 833/1793/111 +f 834/1794/111 836/1797/130 835/1795/130 +f 836/1797/130 838/1799/110 837/1798/110 +f 838/1799/110 840/1801/118 839/1800/118 +f 840/1801/118 842/1803/112 841/1802/112 +f 842/1803/112 844/1805/120 843/1804/120 +f 844/1805/120 830/1789/109 829/1791/109 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index d7c59ae2c..2d472a53a 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -68,6 +68,9 @@ "block.motor": {"category": "block", "sounds": [{"name": "block/motor", "stream": false}]}, "block.engine": {"category": "block", "sounds": [{"name": "block/engine", "stream": false}]}, "block.chemicalPlant": {"category": "block", "sounds": [{"name": "block/chemicalPlant", "stream": false}]}, + "block.assemblerStrike": {"category": "block", "sounds": ["block/assemblerStrike1", "block/assemblerStrike2"]}, + "block.assemblerStart": {"category": "block", "sounds": [{"name": "block/assemblerStart", "stream": false}]}, + "block.assemblerStop": {"category": "block", "sounds": [{"name": "block/assemblerStop", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, "door.wghStart": {"category": "block", "sounds": [{"name": "block/door/wgh_start", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStart.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5761f14fe77c5c6b7e598febb16dbf24a226a59d GIT binary patch literal 5915 zcmcgQdpuOzzk58#duRv^&6HubkP&4>F&?qy(Izoe7-B*mLy8{CBgaS@!%+>#V}>X~ zP0=|@508*n9;K*LNgkC_>h!#8^gHL?-~HUr{oKFq`mDY7ckl07-}QZe*WMmsVP22~ z^slz&xinS`YDl9ClZ6S%yhcf}_L z#f929u_8l>%(&2?_|Ony@P6W^=*W<5L3=|@i2r~@W^~N{I96DAJdt7#6Yay}SZtzw zTo5Y^BmI+$6?A(a3}g#Insl6@bPY4dszaTWtyNY+?}XcR=zXMeJ^M_nHj8#m=BB2Q zEc%@zeYsm9@d5#1n`fMh@g$#JuDPu{_9YQO6U4CYSUEC)a%hv>xE$(Fta2PIo_7Sl zDJ!;86F>q2fX<4cDC!k%Tn`OEFNnv`xLOM_Rx?aFPC-niO-ye_OgY=)%HYp=i<1|J zY%%#oXb*K#gIz180v-uJ-x1A2)S+AmDk-I8J*6n)v>W814hX{8#^N`f#JkoLy888$ zuu6W?z?u-Sa*1<>z&T6ko3o2mte;dyIbCLWu7TCrVARzxbJb*VxibWLZo#+4;AI!r zg+LHCkdjqyne*J2EA%UtP0Khh0i{5Y6qu*DsUGk4RfY*6DEa|`-n~&qkZ+@Bp2SGu2%giI~ zdRS6gFy6o+wt@(t2|eG={V(;fW2rcLBR{#T39MLD1(30Yn1-W+IbeVVJk%MkC=AYm z+X?J$YCADi(d=bOp1ai@0oUECQ?EP+jetdXug&!n8q6BeFrR(F4rXRk+cf`kSh=VM zATUlwD^!y4cSjClMV^>#aRa8}1 z?>=3@`ro@mDd`*p$w81#dn{p7ETKJCEY+fhiINZzg6y{t9OI1Ix#q4w#(NIE?*q21 zP4LDn zpDhgDZ1t*&E(6Op9YaXMl6&K3!dz4_xw4Snp*dZenoCWu8yRKyHhQ1yicl*H?Gd=0$8?4#_;K#E_QH6a;iP7~G9uu`<nmxI$i(Q1C)fSpTKDi?LBYUQHY`E1lm4o*-* z4dGT_G|O1v&14ym44}u2+xY(3%^AF4v%5AL!M6|w;-JhK;WD~>qd)Xq;etr_Aox@fJ1 z$=&sng=`frn+HfGpbXcVq0@|W7I^~w>_z@@Ecye&JieXzZyXVIJ zN2$1)3I6U`o7VfuuW6bO*>g3+PyFvXcJNdCnm$z|n>r1Rrgn?4r`R~Fmn-7u?(F03 zHmR8iV9eMIYah5v!}c>?!)@bUoaT|@Gj+|fBt{n?m6}EUbee5yH5u$(a{~yNE7B-U zUX4r=dDSA>QxTqKBY;%v%M#9N2nuY$K*W|bGtcmjEQsh1rPy`Qgqmpxj4e&$(JAoO zY?qG0R4&y($U_-evIto16caUT7o@2%49S<&5LOj$fI$(83K-e2NW&hkN=F&1gqI2! z)l`uW^L8Pxn+Agw2wanoGR_h5xKv72YAyo9ttiR?b~bx?HXer76DTAJT);X4OchdGKe7+>=8kIahk!Q0t5`VagoTH z*3 zbfc+5km(Z;_knaRig^eb!hzbQc}tUt(-!hUh^F$`JuY|nAn_x>HR#ST+ntUWhxXVx zSBX3kq^4B^aj6n%C_oS;29&NkJFno_l*MGS7{CZsrj+UgPZG`BD6L{+xAF5lVc^c5 zX24xMkr#Y64v{1APy`{Rp@0+!SP5|eFEb}=$O48Oe=@}6ujwJl7YTb%y{huzEfEx< zwrh4#n@{pg(>?9vsHSy1q_Dz78j^_0IO?=0mo+z{M5mJua-8pl%x0c<8=q8-d3Q=76X`IZaO8cFu5H$$APb z(u|xdO5-s&G}%0qV=+0N3RHPIwZ~@2N1Q_W!RNs{HVBx+8yIM|#p&c-Ij5ul2!RzV zuSZL$$?m32W~13upusF^8#tucwQ4eZXtE?GKoHY%#RwezB_E_kEGb@$NW)o8mH=U~ zKnQWg{-1=f1XX0QmjC|`fK_0Ze;*8>jw?4YEkACwY58z_e*h2|@C96k#y1 z1sNPH;G#TWsgtQFG6mulkpl??!7dIuJd_U11q}E1VD&fDNrQ!XVuVAF3oLd(SSU8| z-}C;4{yE(IFA9->8kZ3uqFN+Bh&**Z#=LRSAHcz`1kcVvurMzdJzH3oLx*7jipZ-n zdt9aopcH}Z)Jek%1w6VTDWS(smYkl8%8~MOtX@)ho~R+2H$bBZ)9?ra=jYO$tKxYm zg`6**oR1>TY z5nEpTFsssK1(xb~%0LNjBZ>q@w{TwEU*6)G*))oiy)yMVPje}PElmx!*3Y-^^xV>P zWsoM_s=++)rhX|n7GNbHsWd4_lSnDVKr*t}m9i2#7%Al_DCG$Dl$@e`=?y!5$lBJy zSsMC9E^8p&1WP&^uNv~UC4I@d;>JJIl%swgws6oK2Fmq>R8{-CxB3PIhJ;7P#P2(h z0%(gH7CHbydMj)l9L(A38cQ{`w3iWdbe9uJ;t!t1W@~G^cqf9<)^_nbOG@2v@f9Tg z&JrImE4ShwYI%Fcgfap{gLZ|5F{8qQcZKiS8OpNu_E_ibXxq%<30J0mw;MnF)_nKg zOv{4)@?Ohc^Cc^L?@=u79Sh%^5dUR>rLpTlxxZXZ0YCcJ=G(nx7pymC`UN#=FeayI z&N}6$tDm{_bWwhp4-8u?5xI#g2t89`6_#~=cK_AA526!lqh%CJg!2WA*mSo2?t~X4 z55m0*d6%!BUo!vFL^UDq*^1_Sr_9OPPu6Ktm3Uv!V8bS9womRB+RJ)NEhi0asL=^UTtN+dN$)EX@_x%sZY`= zpHs^x+I4@=#x_c%DA;6}>ACEfSw8*!GdX$eP2N!EJjuT9ckEW2bnR+u zJZp5{=UrB=s}c`RwU2hR5SAZzTzw*WG+Cj<;P|zxOEJ&V)y#E^BbBqppzovEkea3G z&dgUOij#Vx@XPGc(WJ)sZSB6#?(JM1s-w<7NnWQF zWzOckEo@Xy?;eWZkUtFP3>=x+UF-GaLcEM^P)^>vQ1=DJcM9J>8{xxSpmi;LjHLH$ z3^(L&}E(*!X*-Lv4-$1wT|1N+-9b zC!N{Xy9K_Oj$ZuGx#NMo2+zAlu&jH({ECEsL6lW*4Y z`0-N_zG$p(jc*_4a+$y6Gk4uOjo>hw_t%E<%N52A?@G0>QkL09k?RyZGYSP|Mu}&F za&_{P_pF>>^?ZN(I}+qQxNP-ChHfFl(kL>1LMQk_m9SzY{FMxEDEg4)>fd1YxtPP< z-Gz5|{o?2_=agvhhp9i|x+nM5@BPmz69(E<a1-LsF1hjAZyhQOf3*e44(h1yc4p z;I&A{lzmXbdpEsPbo^|H1mAL_>h$r_u@{!>Gj~5KczwX1eay`~+kN8v!Vz|f+R_`! zBvj<%YkW^t_Xg%@)9bHKN|t@KN`Ljv@aP@&Q@eD&f4+o;)aq0MH(EHBuph?K9)A9? z#ykAF-(XZf;#BSEduBq_2)0WlC9&_Hx_fqOb49h9(Zi;Z=;a=py1Y#pHy99x-1 zFI{_}ZqTk0X}(^2dx2NPb}3#fWSmT(q0gT2ei}I-c2+L zvG&wIXuj~}qg}-kJLVprwkL&A9pAPsG+ep-SVeg5#Ky|}zUNzlW-XLg)@nsZJc!x6 zYd-Y;sN^T*x6Yl7I~eRqx24jLErJ>tXtF}FyfF?^Y}p`jzT7dr$;iKY)%vsdf(oyF zG$@j*T+4MfsyO&qY3k10p^0Z0tzsRA)Br=L35Nr5UwduT?BaJQ9V^Bn^{@J4{4J?t zW4+rIR4&n{CdqG-8*iK)IKrB?cyV{yndE(CDO*^67c;K?0fLkYqoIm};3(9q<~8PY zA}x=_xiX_LU7}SG*l(1b^lDAk?^}|l{AZlMnm8sFZ!Nyqbj$P1m|bsCZ>$psPDnqn zS>{{9(h3#F!{brX4H66MYuEg)819}4oh@aJYAbhQbg#)D2fiG*9LmXcqoq6T{cEf0 zo)G%Cgz@%QOn-q*z0HW?F%6Gn>vnt~AC6U-`pe{2+}K#Hz5bVk6r4$C&P>;bIgHgY z($#gmV6}E^PxSiv59^N|#(a@|w%Is8XV(==s963u5Tx#eNy}=@M;a;{I))XRn+D{s zPp4v!k-tQw^}kQxASXMeEAM&pA6%j?fs_3x)#XEH8q!N`yzX?JQG9|MT`C*Y*;@0o zrtnh#Tjd#*1lBO#g%iws43q0r8 z$B$)}4_Zx+S}T?Ht-hL_;Y3_p|JRNTt)q%xEVv~jSy=O&gofGHdeV`M3+>~QKw)xLE*b*J)da4Oaem4WmVhTrA$!GDBCRY(>SPtePaztK8m_pB*M zV<`BT?yK;vi99&=0p7|2N%gAlHeRp3T`ht9&dD*8FfBA*7N)Adq5WplqZG~WO_D82 z^#?*m;FEp2b!a~bT zLC)((4N2ClC+wazK7V}Th^MXO2T4mv{!sOrM?SNZ9*c@u!#`pSJf-`; z9=WQ-kJEks!Mf4gxcQYK>!kn1KjZh_e?O!!*9HZ+LZ4*hH6cyzha!z6Qbh88zwZX# zxl;n$<{&}o9KUA=5_2Ql^2euc=J1057J;uu&t!tJ?rhrnZn@2l2x3*M1tC?hn!75d z4{ZprT3{zHyB*XQ`qbzA#S_)u`Z4HV@DJk7x}Nqr-_IHUN?ogA@msNqcfhaSiPndY7~WK~ z%KIUw{HF_cJEk-9utVbY=*j$#=M&8oukKDzpF2PGwrlOBYfq)z`UDp0DwCWj{MQv% zH^``5OD~m7@eXioSFX_CwK_nW_*KM=UJ02d*PhH6T2<+soun9GfU&)h^lLUI<6%1l F{RhyDxEBBb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a6e656e9134fcc8bfcd3b5ffb4208a93f842b0d9 GIT binary patch literal 6581 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6ef5dcf3885957e0163b91e9c94e2c27ab2349cc GIT binary patch literal 7855 zcmahuXIPWXvKx9gR1pFMBvJ$=^nge}DG5Cgs-YJVQKSjh2%#$?(!{_AQlyB2LMVz- z0|L@}SCpzE7C`aS`v%WZBV3e4T~x zhDpN0&jx$?hcG%|;4-6v(vLq?9n6YB`R~M_gh4GTR~CjZ==Xmle&#=Hl%P>Z|DcnH ztb+ZJr~N(ccbOw`NL3ZIh6-9m11bOJF6G}@fgzLx^x2;E4L$D>?4xIU_Dm$w_H5W0 zZ=~_rU_T$E_92x$5W;Z-J0m?+6%{RIw2HE-28{L3d@_c|>|p>4fNY4UqH$4(2n8-? zXuWR%Vb~k+exIQ^e-uL1+@%{8k|JH0XBh7yf2}`-2p9x$1`$G(L<0_K3QEs0HCj#& zg5ohypFg7yZun1OggFU~8gNKZ7F4u(qTgw6BPd1~M>y2CjHK)_tjmsmfPs)@HB7Ce z*)YopN{f}Z_Ewiw0FAVTEN9I^(cDbZ{OouU+D z14sfkOq~#=+n_{@qKM&;q9E11g+U4cdH3WK@5yt)#U68kP5|Io8=;PKh?lnzFRKvT z9K24fjD6#P@Jtg6O_Sf6rph{{qIUCQLYY$cceA)Oaj0DxRCNlMIVm)Sw8q)i6k&5nx zpnFs&o@@wjiQ1Ou#PtV~tBUN;R%G;@>s@iD^3x&cKt*Iq_Kg|{Vy*B`&Ni!pAk+Ft z!d){)UkHQMZn4_Ff}jdAnk9|(8F%~JA;^lpGE0U38)X-7SIN+NvGCX%9@7dOgG(oo z#{8aQsw)Ot%PO2=(Nx3Lf#s8hX*wLJ^m7Ef+#iKA0W61fj1a-}pTaXr; zH6n)jjAev5)n0ZPk0EVco`Ldqn1^GAkJJCjf0hoNKO|)Ae-@%Z7Y*sbEX$_B|5+xq zp&&@eWY^wsk7dmUWnT>{S$$Er64bL1G8$4R4hWNMv;u83eTFnhwwffOeV{`|pbIT* zD${3b>+;-xWD@)C5(NOzN!_oIDx;9Ppq(s>!=CI^1Xwo4iA;PWpS+-*DvL`+`KS6t zW|Z8?Ub&O2ShkA-;0zQ-N-T~@ER9GkiAY|KPd#}jqog$ZU{~?`hKFnaEpzW0xGVsn zvL?Z@CInd{0tD=8m(0V^E}|7JYZR>1J*fU?jRS&ukU||o|6CgX+5iA}URDZq4!Dz&m_}`Mnkh+B+q*zYIfo(!idX-C3aGc6niSli-%LD^

tAsJtx! zOfUzoqKhVRgr;E=O0psPI6<7lea2`+ zhtV(#A<~$w#e^`Cm_eKv@gZh}xrGu*4y3U$qQmCpiP6iX(J&8D2IsMnFk*O^+i2ii zW*Euwz^+szA|#at#2Jz*5Mt%rwJD2XWD>Gx%HY|)p z3-rngblGbO$qbEpq?2Yc!=^;fkhX5TQV*O8C6Tm94r75NtyrhA%Wif=HwT{yEqkX; z=p0ss&50TlN5X8wW8A`g-0H&IoX(Jzp3!cc-swWGJy-i_9O|Z>F+x*#bcVb2!P<7q zN2RBq4(bh6hYb!4`?_~|K zf+klesU`Je`xoVTdWkxnNj2;b2f`;bJ1F%hqi=vrhzZ{vA5wDLAld_q;beLxa=$r{gChZ(L4 znmn*#R1z9sOkPSC_3EvnyV?fS&_pj8Exyq$_+m!_ntE+Hu?ge3$e)p?B?ZH*5oN=tK2 zs!B^G1fWGAUq26dX!q#iwl^Rq_5lkZzyMFOms74^cG;=!WK?9Xd|7e%Ds8`0u3TbS zSs5)bGFJhr8y-G%+3jg~SiY9)zuTj<_8g)rD|>jb`}x_jGU%p-!irCK%T^npp2r`! z%h$RdD^1bPh_|jbKoJKmaINbcgtYU#3SmNfxYMBWlO6=!yGNQ~prk2wgx@le&cw~Q z3cVo_=}2!lp%Y1g{HX#ZjR3hMHUt1n=JL$DV&8-Ae3=I|qt0FxP?5xd0xBSvx$8Io z-vR~*f_#9mNAo0JiSLgdg&BHOC`Lr{=(MJV^yB1FMUYyl(WwM{dI$lJE3Fx2SSv$& zzHoxSGF>d-6%x|ub@V1=Kgx9HkUl-g=96khr$eA7;$oix$8AD+%_4%rS61U3(2Lnd zng>*kiiN@rMFDvTQvU__)>RHUBd=@!Yybx(&9euZ^cWt!$Ou*9{xm}@(R8S3z>&`w zWq4%9C?gQUbe7hm3&h99Obm*U^Aryn|#;X1Qidyp-$c*?E2FR>@kgL&r zkQ_u%7ja~m5+hEGnhaJ#tC?aJl{8tTS?h_W3hmXt#{1sY5xJxb)x9mz-i2+>A*Ij` zfGCJu8V1-nxO@S*8P>9dTxQ`&)&#&Hz6YKV8#DhYPXH-X%tUTui8%pED(g(2){ze} zpXhIgoIQsjJjxM)g>hU9itn4E{Y02%(DUy$~0{-j)I7u%kef5(b#0_6MatDn1HB(E>k*QxjI>3pNu zk<2viH*<}}F_RgbiakE+P2c|AJCmuo>5{pf-8)dM(RNuoq42lGx~V_{x}og3dyZms=Yt##!mA{goHoEwX zdh+($UHnG8F>tf1_d`{{aC!N8o>87{qGv~~Z0)0)k@`#136b=9Rs$W2>LIno4~}yz ziqqfV`A_!7v`yRT<8-2UM5GQYdw=L(cUlP!^9{3jJ$1D|!TiMZQGR;is8g^+d2Hkl zPv_%36=GhiS%QsvwE-ETsv;2xOB^hs2PTcI{QUmyp8CwjZK)wlj^y*RTjokp&vGhx zRrmye`cQgBYAbc6Y`tBg!C(27Rj6Fm-(ejq#e2S>*gf11uMOn;qHJtzuJw0j>(E7= zA~dajeEnfl!r{DwGC_RJ&R@9W+n0LtYw8F=YgSn7<|MkD+3n@d_`_WNZ;NN9ZXaaJ z+K?2?PUg!M&KcULE$}h^KJ1mau|$s&3KMQIPw1jN~%CJS8=-T-HwyyfRuP3`}@f=kKU;Kv^=sTfHoMvNE!}!d9^-cbgRL6LB z=1|2e!wmsaqwu}5A4OY&fk)c7SSFr{Q!yJG#mrP>X;U_gthjgna9{|%usvTb*F@;t zvwFnUoUDVWX)6aWZoS`x^`fAOGH^rW(hB&o-9zV@i*Y$?-g?iSXOGKXx8ox(#BCH2s%YEz2o|!Pn8Fu~Sb+>J21^t^G$ za{iNzQ^aJE|3JuM+ExA1RMW5D&gq};2zsHrG?!aZxrO@5rny{UcP)U=yyR%^`|~o$ znBSd$h1yFhdR{dwxsb2Mv^^PUmmAL|?4F^+DnMJ*X}ftxdN%C9SMrww1*gu*Z7QaG zt^2h$Ra;wiC5szp2HFFgp`W+&>ao=tn$|*!)2;sbSv|i>1<@)2d^E{xFmT} zPPjRPCO)>+BXa|PyR?+Wxec{A>vSKzJ&ahnyKW}*Fs#Vn&LPwM!|8#r9aQ6Z0=+ z{M`BZytpIwQsaBvdq2wbt$KeyZtt?{u0dqrh`CfZr`Z@U@Xa#m3+C>b)(04F?*127 z%`uc-`x&;zai@{A;T{Y#w$G;bhr4;+;g!dSnIui0zy-*(RzPs9kWEv%9anYXsYrsv zBpUnLke5Y0fM=aY@qI@fZr%sFPZM3;O|G?1Bw)Nvh73K!TXd3-Wh^f^s|}rUAU3us z8syOvqz3bpgU;p{gLueiU>7B@cEV3z%SXH) z9R%yl=BS7+6B_apDq>jnlK0>2Fa7nCLjZ7ZMKjHFG$;XAt!_a(Fg?kF-_BEP7CWkE za{OZU)R{(|;wo6jF(%N&J>Gs=kU5l~rIp0dgabymbXw)~D!~;kUwY(cj0{ z&f}fmTr@fzGgM)lMQ*S;Yf4VF9TzDQGpBr%AKT;yF-g98AD04T?zORx(R^6}g$;U6 zqDuvZNraD#)cw48Sp4JAW}Fk@XLHN+;>JWZ<;m&b?Y(h)v#)25xJpH&AWtifQ>(&1 zy||;zuhzp4mKHu!d4M9<%fr#E*i~RaMCG4`f0=b@kGJ<&IcE;~$a^4nr|# z?z3O8{Zpz7>-Qbn5mQd0bVBC)=P4G~4lbM$ zNPXvC+Z~aLrb_AF9>qKxXpB0SeKCB1mn;(Tl}SaC49IMvAIXG#snbp@V@N>eh|XH{ zJ87Hjk>NAjRDbN#bl+PlTIzE-tusA8joDa&1yKb~S0B$cWXFC&wL%Xjq~0O(ljKL1 zT!2g%8su{Lb|vmXA`#C^p0+EO^Tgx%RmCH#RE+MQ(}MLLnwz}a`y0<~(?Vr(a@RWT zUCrA4E5Hr~a)zgI>1<%Db{HE4VkZR1D+hJAj#zoh#P2XmkD5_QL~xzkeYlwxHj5^i`g1 zdj4-h%0z&!Oxy(R;z*=Y(X+U@%$)07l(fLnr_t&=;Y{w*E!KLtO|gcoow>&zZr`V> zb<-t&S978LVDo%bz(rsIU|sWDwm|{d`DAp28xa(?bzx02>GJV3L_=v|c2LkS6V;$c zx5KgH>%kw@kX4e_$&N{~e-*t`Y)mIo-?19zcbb^RrI}|_I6ohKK$)4#Q zolq}AJA@X~_cxk119jr=Ft+zH!k26x8L9Lez-MO#Vy}Pi_42bo&3z)h`Bo#Arlgn` ze-IcZybP1;f1JSWaq&R&@` zdeY}z%J;4I{`bpLbmh9A?Q|tfpip>RQS<(%D=&XOx+!e|ZVwBSxddiUU0?$9Q;+%q za&q#_I8%QC5AW;nczdm?iXm*dh33!c6I}!na*`IWt9|NM|d9X_t3Zvv2fvIdsrb}?)i&we_l*U+epNr{TyK^JM>G&42c+GLEKEw09-ed; zG>jav+&5e{Yp>h=y!hBXF8)4!II{%u4fRy=Zy1Iftb)TLyljQ5c)-H^#)W=v>zR`?a!A zy-&Nz#_dHW$>-`;X(=C;?z?BCg^hCMilT50EfW>qsRlO^;Q2|YmC{ry3%X$P+U#YvY)}iV9Rt0%Mb9FMdo&SVHSJEh1R88BO`~!aP7|x-+;EW8$o+a-) z^hZx{=xV{u)YHoXdtI)4wGWKeTIa|lP@b*Wo=cHPy>!!ezU8u^k*7;_Q7F)m5 zVbjM?eSg)qv1POMo5NDnmE5H{1l^k*U^ilH)UDWax6rsxQwF?5|2-4d%_&T8m><5r zE}`<)0TU7{4k}GqYgx(h9Bob;W7S8Vj~?$kx@QSBKgN}!&n!>A zb{qzjUx=^(`8WqWH6N}?FYBl0t0=5z^i50SMbkBhsBiBnLWCvo_-r267MKdvk6iZO5Z zX}$_X8!s)#oRnT+f1l7kTf;t?NSX5$CtJd=m05rvy#1WxFu;V65q>5M1URu5ELMVx zhp6X&9+*hN_s`G7+i&qTVVCFCU7#ltAau);3#QM+fsEo81bxcdtQkue|9Ey!YuMG_;VrB42M4qYTC&hH28ABxtR8SMn5hBkTB8UOFmf`XK@5x1 z7!m|(7@1~k9r}>9-5N+(uqZ{8W3=`7)8b^ChR#&B z!WstI@?fV_Fd%Cf@b-5fWYPk%zIk#LXP$iDS#oU%5PeLWYUup+}}0V-{*mrPI|1{^udIY_otAXTejzUha1Yjd)l0O zkn^N9HNb=v-YO|SABA2)m)f#-HQeQc&m4|97C%=_GQMGsUrF3o|LuBxn&x2XP`_Pd zD3@cu!AZ%wV?*g>aSx_F>|Rk>JCqF*6|SrOWZr!`U=fF2))|TMbifSNa0^i-rnaZK zOK6Kv#yV#jNg@-cks^BTA4wtW*On!)=^`2t>R`H3>yYt0E4bB)m0sB144s%dD)=?G z{382@`n}Z+$ayZ1>vPr<#B}O~hwr6@i=-}P4PAKDQY7FP8FOK?=y_|6?@bN0E7n-k zn7vkJA#@o_GaWf^Z+h}TL4alLA^U@sb1Z~8huR6x15M`ywwe_>g@SW#c8cs#3YH%M z5i&=~e6kJdlO98oVcKZ#h%$K*>$Q%N+K+%gK=? ztXOXGD?**DG6rjpbZ?**HJ?>#|HUWYKLl^`ye7rW3Yun1!3ALsP&4Ak>4(hW)l-r@ YaczwCwuhcrq;BLX_|f}WJi6e200IwrB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg b/src/main/resources/assets/hbm/sounds/block/assemblerStrike2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2850ce7ac84cfb742cb920b126e2c973a5a8ee18 GIT binary patch literal 8532 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 D!x(^6 delta 2724 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 Date: Mon, 14 Jul 2025 16:42:54 +0200 Subject: [PATCH 39/45] half-priced salammi --- changelog | 6 + .../java/com/hbm/crafting/ToolRecipes.java | 2 +- .../ContainerMachineAssemblyMachine.java | 5 +- .../gui/GUIMachineAssemblyMachine.java | 3 +- .../gui/GUIMachineChemicalFactory.java | 3 +- .../gui/GUIMachineChemicalPlant.java | 3 +- .../gui/GUIScreenRecipeSelector.java | 24 +- .../inventory/recipes/AssemblerRecipes.java | 1 - .../recipes/AssemblyMachineRecipes.java | 313 +++++++++++++++++- .../recipes/loader/GenericRecipe.java | 12 + .../recipes/loader/GenericRecipes.java | 29 ++ .../recipes/loader/SerializableRecipe.java | 2 + src/main/java/com/hbm/items/ModItems.java | 13 +- .../com/hbm/items/machine/ItemBlueprints.java | 132 ++++++++ src/main/java/com/hbm/main/MainRegistry.java | 2 + .../hbm/module/machine/ModuleMachineBase.java | 11 +- .../TileEntityMachineAssemblyMachine.java | 3 +- .../TileEntityMachineChemicalFactory.java | 4 +- .../TileEntityMachineChemicalPlant.java | 3 +- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/gui/processing/gui_assembler.png | Bin 3445 -> 3490 bytes .../gui/processing/gui_chemical_factory.png | Bin 3531 -> 3644 bytes .../textures/gui/processing/gui_chemplant.png | Bin 3535 -> 3594 bytes .../assets/hbm/textures/items/blueprints.png | Bin 0 -> 379 bytes .../textures/items/blueprints_discover.png | Bin 0 -> 397 bytes .../hbm/textures/items/blueprints_secret.png | Bin 0 -> 313 bytes 27 files changed, 536 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/hbm/items/machine/ItemBlueprints.java create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints_discover.png create mode 100644 src/main/resources/assets/hbm/textures/items/blueprints_secret.png diff --git a/changelog b/changelog index 914e54d80..6be709682 100644 --- a/changelog +++ b/changelog @@ -3,6 +3,12 @@ * Features a brand new animated model, GUI and the new recipe selection system * Many recipes have been reworked, with the microcrafting complexity reduced * The redcoil didn't get a recipe. It's gonna die soon. + * Neither did the schrabidium transmutator + * Balls-o-tron's spawner can now be made without a worm coin, using a silver key instead. This means that, while expensive, it's possible to summon him without finding a jungle dungeon +* Blueprins + * Replace the journals + * Instead of opening them and making a template, they act as a multi template + * Blueprints need to remain in the slot, removing them will disable the recipes again ## Changed * Removed levitation unit diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 39c00cde5..de9dc346f 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -159,7 +159,7 @@ public class ToolRecipes { //Bobmazon CraftingManager.addShapelessAuto(new ItemStack(ModItems.bobmazon), new Object[] { Items.book, Items.gold_nugget, Items.string, KEY_BLUE }); - + //Carts CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.WOOD, EnumMinecart.EMPTY), new Object[] { "P P", "WPW", 'P',KEY_SLAB, 'W', KEY_PLANKS }); CraftingManager.addRecipeAuto(ItemModMinecart.createCartItem(EnumCartBase.STEEL, EnumMinecart.EMPTY), new Object[] { "P P", "IPI", 'P', STEEL.plate(), 'I', STEEL.ingot() }); diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java index f7bc0d499..507d41e66 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAssemblyMachine.java @@ -3,7 +3,6 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotCraftingOutput; import com.hbm.inventory.SlotNonRetarded; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.util.InventoryUtil; @@ -51,12 +50,12 @@ public class ContainerMachineAssemblyMachine extends ContainerBase { if(slotOriginal.getItem() instanceof IBatteryItem || slotOriginal.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(slotStack, 0, 1, false)) return null; - } else if(slotOriginal.getItem() instanceof ItemAssemblyTemplate) { + } else if(slotOriginal.getItem() == ModItems.blueprints) { if(!this.mergeItemStack(slotStack, 1, 2, false)) return null; } else if(slotOriginal.getItem() instanceof ItemMachineUpgrade) { if(!this.mergeItemStack(slotStack, 2, 4, false)) return null; } else { - if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 7, false)) return null; + if(!InventoryUtil.mergeItemStack(this.inventorySlots, slotStack, 4, 16, false)) return null; } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java index 1572ed3be..d69a8f062 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineAssemblyMachine.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineAssemblyMachine; import com.hbm.inventory.recipes.AssemblyMachineRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineAssemblyMachine; @@ -52,7 +53,7 @@ public class GUIMachineAssemblyMachine extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(AssemblyMachineRecipes.INSTANCE, assembler, assembler.assemblerModule.recipe, 0, ItemBlueprints.grabPool(assembler.slots[1]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java index a31917752..567b2e256 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalFactory.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalFactory; @@ -57,7 +58,7 @@ public class GUIMachineChemicalFactory extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, this); + for(int i = 0; i < 4; i++) if(this.checkClick(x, y, 74, 19 + i * 22, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule[i].recipe, i, ItemBlueprints.grabPool(chemplant.slots[4 + i * 7]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java index 9f02d0adf..78a2e619b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineChemicalPlant.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineChemicalPlant; import com.hbm.inventory.recipes.ChemicalPlantRecipes; import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.items.machine.ItemBlueprints; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineChemicalPlant; @@ -54,7 +55,7 @@ public class GUIMachineChemicalPlant extends GuiInfoContainer { protected void mouseClicked(int x, int y, int button) { super.mouseClicked(x, y, button); - if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, this); + if(this.checkClick(x, y, 7, 125, 18, 18)) GUIScreenRecipeSelector.openSelector(ChemicalPlantRecipes.INSTANCE, chemplant, chemplant.chemplantModule.recipe, 0, ItemBlueprints.grabPool(chemplant.slots[1]), this); } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java index 6f101ef29..4a5e3bb83 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenRecipeSelector.java @@ -50,16 +50,18 @@ public class GUIScreenRecipeSelector extends GuiScreen { protected int index; protected IControlReceiver tile; protected GuiScreen previousScreen; + protected String installedPool; - public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { - FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, previousScreen)); + public static void openSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { + FMLCommonHandler.instance().showGuiScreen(new GUIScreenRecipeSelector(recipeSet, tile, selection, index, installedPool, previousScreen)); } - public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, GuiScreen previousScreen) { + public GUIScreenRecipeSelector(GenericRecipes recipeSet, IControlReceiver tile, String selection, int index, String installedPool, GuiScreen previousScreen) { this.recipeSet = recipeSet; this.tile = tile; this.selection = selection; this.index = index; + this.installedPool = installedPool; this.previousScreen = previousScreen; if(this.selection == null) this.selection = NULL_SELECTION; @@ -83,7 +85,11 @@ public class GUIScreenRecipeSelector extends GuiScreen { private void regenerateRecipes() { this.recipes.clear(); - this.recipes.addAll(recipeSet.recipeOrderedList); + + for(Object o : recipeSet.recipeOrderedList) { + GenericRecipe recipe = (GenericRecipe) o; + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } resetPaging(); } @@ -92,15 +98,17 @@ public class GUIScreenRecipeSelector extends GuiScreen { this.recipes.clear(); if(search.isEmpty()) { - this.recipes.addAll(recipeSet.recipeOrderedList); + regenerateRecipes(); } else { for(Object o : recipeSet.recipeOrderedList) { GenericRecipe recipe = (GenericRecipe) o; - if(recipe.matchesSearch(search)) this.recipes.add(recipe); + if(recipe.matchesSearch(search)) { + if(!recipe.isPooled() || (this.installedPool != null && recipe.isPartOfPool(installedPool))) this.recipes.add(recipe); + } } + + resetPaging(); } - - resetPaging(); } private void resetPaging() { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index f725cd17a..13e823907 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -197,7 +197,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.solinium_core, 1), new AStack[] {new OreDictStack(SA327.nugget(), 9), new OreDictStack(EUPH.nugget(), 1), },400); makeRecipe(new ComparableStack(ModItems.solinium_propellant, 1), new AStack[] {new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 3), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.plate_polymer, 6), new OreDictStack(W.wireFine(), 6), new ComparableStack(ModItems.biomass_compressed, 4), },350); makeRecipe(new ComparableStack(ModItems.schrabidium_hammer, 1), new AStack[] {new OreDictStack(SA326.block(), 35), new ComparableStack(ModItems.billet_yharonite, 128), new ComparableStack(Items.nether_star, 3), new ComparableStack(ModItems.fragment_meteorite, 512), },1000); - makeRecipe(new ComparableStack(ModItems.component_emitter, 1), new AStack[] {new OreDictStack(STEEL.shell(), 3), new OreDictStack(AL.shell(), 2), new OreDictStack(STEEL.plate(), 32), new OreDictStack(PB.plate(), 24), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.pipes_steel, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new OreDictStack(STAR.ingot(), 26), new ComparableStack(ModItems.powder_magic, 48), new ComparableStack(ModItems.crystal_xen, 1), },2500); makeRecipe(new ComparableStack(ModBlocks.machine_radar, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 8), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(ANY_RUBBER.ingot(), 8), new ComparableStack(ModItems.magnetron, 3), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.coil_copper, 12), new ComparableStack(ModItems.crt_display, 4), },300); makeRecipe(new ComparableStack(ModBlocks.machine_radar_large, 1), new AStack[] {new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 16), new OreDictStack(ANY_RUBBER.ingot(), 16), new ComparableStack(ModItems.magnetron, 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_copper, 32), new ComparableStack(ModItems.crt_display, 4), },600); makeRecipe(new ComparableStack(ModBlocks.machine_forcefield, 1), new AStack[] {new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1), },1000); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 629e10584..39f2fc198 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.List; import static com.hbm.inventory.OreDictManager.*; -import static com.hbm.inventory.material.Mats.*; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.FluidStack; @@ -17,11 +16,18 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; +import com.hbm.items.ItemEnums.EnumCasingType; +import com.hbm.items.ItemEnums.EnumSecretType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; +import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.items.machine.ItemPistons.EnumPistonType; +import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -41,6 +47,20 @@ public class AssemblyMachineRecipes extends GenericRecipes { public void registerDefaults() { // plates and ingots + this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plategold").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gold, 1)).inputItems(new OreDictStack(GOLD.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platetitanium").setup(60, 100).outputItems(new ItemStack(ModItems.plate_titanium, 1)).inputItems(new OreDictStack(TI.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platealu").setup(60, 100).outputItems(new ItemStack(ModItems.plate_aluminium, 1)).inputItems(new OreDictStack(AL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platesteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_steel, 1)).inputItems(new OreDictStack(STEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platelead").setup(60, 100).outputItems(new ItemStack(ModItems.plate_lead, 1)).inputItems(new OreDictStack(PB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platecopper").setup(60, 100).outputItems(new ItemStack(ModItems.plate_copper, 1)).inputItems(new OreDictStack(CU.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platealloy").setup(60, 100).outputItems(new ItemStack(ModItems.plate_advanced_alloy, 1)).inputItems(new OreDictStack(ALLOY.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plateschrab").setup(60, 100).outputItems(new ItemStack(ModItems.plate_schrabidium, 1)).inputItems(new OreDictStack(SA326.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platecmb").setup(60, 100).outputItems(new ItemStack(ModItems.plate_combine_steel, 1)).inputItems(new OreDictStack(CMB.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plategunmetal").setup(60, 100).outputItems(new ItemStack(ModItems.plate_gunmetal, 1)).inputItems(new OreDictStack(GUNMETAL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.plateweaponsteel").setup(60, 100).outputItems(new ItemStack(ModItems.plate_weaponsteel, 1)).inputItems(new OreDictStack(WEAPONSTEEL.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platesaturnite").setup(60, 100).outputItems(new ItemStack(ModItems.plate_saturnite, 1)).inputItems(new OreDictStack(BIGMT.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); + this.register(new GenericRecipe("ass.platedura").setup(60, 100).outputItems(new ItemStack(ModItems.plate_dura_steel, 1)).inputItems(new OreDictStack(DURA.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates")); this.register(new GenericRecipe("ass.platemixed").setup(50, 100).outputItems(new ItemStack(ModItems.plate_mixed, 4)) .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) @@ -96,6 +116,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(MINGRADE.wireDense(), 1))); this.register(new GenericRecipe("ass.sealcontroller").setup(100, 100).outputItems(new ItemStack(ModBlocks.seal_controller, 1)) .inputItems(new OreDictStack(DURA.ingot(), 1), new OreDictStack(STEEL.plateCast(), 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(MINGRADE.wireDense(), 4))); + + // nuclear door mod + this.register(new GenericRecipe("ass.vaultdoor").setup(600, 100).outputItems(new ItemStack(ModBlocks.vault_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 32), new OreDictStack(DURA.ingot(), 32), new OreDictStack(PB.plateCast(), 8), new OreDictStack(ANY_RUBBER.ingot(), 12), new OreDictStack(DURA.bolt(), 32), new ComparableStack(ModItems.motor, 3))); + this.register(new GenericRecipe("ass.blastdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.blast_door, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(PB.plate(), 6), new OreDictStack(ALLOY.plate(), 6), new OreDictStack(ANY_RUBBER.ingot(), 2), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 1))); + this.register(new GenericRecipe("ass.firedoor").setup(300, 100).outputItems(new ItemStack(ModBlocks.fire_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(ALLOY.plate(), 8), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 2))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ // machines this.register(new GenericRecipe("ass.shredder").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_shredder, 1)) @@ -106,6 +139,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.centrifuge_element, 1), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(STEEL.plate528(), 8), new OreDictStack(CU.plate(), 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.gascent").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_gascent, 1)) .inputItems(new ComparableStack(ModItems.centrifuge_element, 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(DESH.ingot(), 2), new OreDictStack(STEEL.plate528(), 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.arcfurnace").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_arc_furnace, 1)) + .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal()))); this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) @@ -122,19 +157,69 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) + .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.ingot(), 12), new OreDictStack(W.ingot(), 4))); + this.register(new GenericRecipe("ass.drillsteeldiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal()), new OreDictStack(DIAMOND.dust(), 16))); + this.register(new GenericRecipe("ass.drilldura").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(TI.ingot(), 8))); + this.register(new GenericRecipe("ass.drillduradiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.HSS_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.HSS.ordinal()), new OreDictStack(DIAMOND.dust(), 24))); + this.register(new GenericRecipe("ass.drilldesh").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(RUBBER.ingot(), 12), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.drilldeshdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.DESH_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.DESH.ordinal()), new OreDictStack(DIAMOND.dust(), 32))); + this.register(new GenericRecipe("ass.drilltc").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 20), new OreDictStack(DESH.ingot(), 12), new OreDictStack(RUBBER.ingot(), 8))); + this.register(new GenericRecipe("ass.drilltcdiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.TCALLOY.ordinal()), new OreDictStack(DIAMOND.dust(), 48))); + this.register(new GenericRecipe("ass.drillferro").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal())) + .inputItems(new OreDictStack(FERRO.ingot(), 24), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 12), new OreDictStack(BI.ingot(), 4))); + this.register(new GenericRecipe("ass.drillferrodiamond").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.FERRO_DIAMOND.ordinal())) + .inputItems(new ComparableStack(ModItems.drillbit, 1, EnumDrillType.FERRO.ordinal()), new OreDictStack(DIAMOND.dust(), 56))); + this.register(new GenericRecipe("ass.slopper").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_ore_slopper, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(TI.plate(), 8), new OreDictStack(CU.pipe(), 3), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.mininglaser").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_mining_laser, 1)) - .inputItems(new ComparableStack(ModItems.tank_steel, 3), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3), new OreDictStack(DURA.plate(), 4))); + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(TI.shell(), 4), new OreDictStack(DURA.plate(), 4), new ComparableStack(ModItems.crystal_redstone, 3), new ComparableStack(Items.diamond, 3), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.motor, 3))); this.register(new GenericRecipe("ass.teleporter").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_teleporter, 1)) .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(ALLOY.plate528(), 12), new OreDictStack(GOLD.wireFine(), 32), new ComparableStack(ModItems.entanglement_kit, 1), new ComparableStack(ModBlocks.machine_battery, 1))); - + this.register(new GenericRecipe("ass.radar").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_radar, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(ANY_RUBBER.ingot(), 12), new ComparableStack(ModItems.magnetron, 5), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC.ordinal()), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.radarlarge").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radar_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4))); + this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) + .inputItems(new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); + this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) + .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))); + // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.combustiongen").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_combustion_engine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 16), new OreDictStack(CU.ingot(), 12), new OreDictStack(GOLD.wireDense(), 8), new ComparableStack(ModItems.tank_steel, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.pistonsetsteel").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STEEL.ordinal())) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(CU.plate(), 4), new OreDictStack(W.ingot(), 8), new OreDictStack(W.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdura").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DURA.ordinal())) + .inputItems(new OreDictStack(DURA.ingot(), 24), new OreDictStack(TI.plate(), 8), new OreDictStack(W.ingot(), 8), new OreDictStack(DURA.bolt(), 16))); + this.register(new GenericRecipe("ass.pistonsetdesh").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.DESH.ordinal())) + .inputItems(new OreDictStack(DESH.ingot(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new OreDictStack(CU.plate(), 24), new OreDictStack(W.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); + this.register(new GenericRecipe("ass.pistonsetstar").setup(200, 100).outputItems(new ItemStack(ModItems.piston_set, 1, EnumPistonType.STARMETAL.ordinal())) + .inputItems(new OreDictStack(STAR.ingot(), 24), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(BIGMT.plate(), 24), new OreDictStack(NB.ingot(), 16), new OreDictStack(DURA.pipe(), 4))); this.register(new GenericRecipe("ass.turbofan").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_turbofan, 1)) .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); - + this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) + .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16))); + + // condensers + this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4))); + // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); @@ -144,7 +229,19 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); - + this.register(new GenericRecipe("ass.fensusan").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.machine_fensu, 1)) + .inputItems(new ComparableStack(ModItems.ingot_electronium, 32), + new ComparableStack(ModBlocks.machine_dineutronium_battery, 16), + new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 64), + new OreDictStack(DURA.block(), 16), + new OreDictStack(STAR.block(), 64), + new ComparableStack(ModBlocks.machine_transformer_dnt, 8), + new ComparableStack(ModItems.coil_magnetized_tungsten, 24), + new ComparableStack(ModItems.powder_magic, 64), + new ComparableStack(ModItems.plate_dineutronium, 24), + new ComparableStack(ModItems.ingot_u238m2), + new ComparableStack(ModItems.ingot_cft, 128))); + // fluid tanks this.register(new GenericRecipe("ass.tank").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_fluidtank, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_TAR.any(), 4))); @@ -153,7 +250,18 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.orbus").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_orbus, 1)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 8), new OreDictStack(BIGMT.plateCast(), 4), new ComparableStack(ModItems.coil_advanced_alloy, 12), new ComparableStack(ModItems.battery_sc_polonium, 1))); + // accelerators + this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + + // reactors + this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + + // fusion reactor + this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 6), new OreDictStack(W.plateWelded(), 6), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.coil_advanced_alloy, 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); this.register(new GenericRecipe("ass.fusionconductor").setup(100, 100).outputItems(new ItemStack(ModBlocks.fusion_conductor, 1)) .inputItems(new ComparableStack(ModItems.coil_advanced_alloy, 5))); this.register(new GenericRecipe("ass.fusioncenter").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_center, 1)) @@ -162,6 +270,12 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.ingot(), 4), new OreDictStack(STEEL.ingot(), 2), new ComparableStack(ModItems.motor, 4))); this.register(new GenericRecipe("ass.fusionheater").setup(200, 100).outputItems(new ItemStack(ModBlocks.fusion_heater, 4)) .inputItems(new OreDictStack(W.plateWelded(), 2), new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(OreDictManager.getReflector(), 2), new ComparableStack(ModItems.magnetron, 2))); + this.register(new GenericRecipe("ass.blankettungsten").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_tungsten, 1)) + .inputItems(new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96))); + this.register(new GenericRecipe("ass.blanketdesh").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_desh, 1)) + .inputItems(new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96))); + this.register(new GenericRecipe("ass.blanketchlorophyte").setup(600, 100).outputItems(new ItemStack(ModItems.fusion_shield_chlorophyte, 1)) + .inputItems(new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48))); // watz this.register(new GenericRecipe("ass.watzrod").setup(200, 100).outputItems(new ItemStack(ModBlocks.watz_element, 3)) @@ -171,6 +285,13 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + // upgrades + this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.overdrive2").setup(600, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_2, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_1, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + this.register(new GenericRecipe("ass.overdrive3").setup(1_200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_3, 1)) + .inputItems(new ComparableStack(ModItems.upgrade_overdrive_2, 1), new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(ANY_BISMOIDBRONZE.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); @@ -179,6 +300,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { // rancid shit mob spawners this.register(new GenericRecipe("ass.chopper").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_chopper, 8)) .inputItems(new OreDictStack(CMB.plateCast(), 24), new OreDictStack(STEEL.plate(), 32), new OreDictStack(MAGTUNG.wireFine(), 48), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CONTROLLER_ADVANCED))); + this.register(new GenericRecipe("ass.ballsotron").setup(1_200, 100).outputItems(new ItemStack(ModItems.spawn_worm, 1)) + .inputItems(new OreDictStack(TI.plateWelded(), 32), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.motor, 64), new OreDictStack(GOLD.wireDense(), 64), new OreDictStack(U238.block(), 10), new ComparableStack(ModItems.mech_key, 1))); // weapon parts this.register(new GenericRecipe("ass.clusterpellets").setup(50, 100).outputItems(new ItemStack(ModItems.pellet_cluster, 1)) @@ -212,7 +335,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.customnuke").setup(300, 100).outputItems(new ItemStack(ModBlocks.nuke_custom, 1)) .inputItems(new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), new OreDictStack(KEY_GRAY, 4))); this.register(new GenericRecipe("ass.levibomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.float_bomb, 1)) - .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); + .inputItems(new OreDictStack(TI.plate(), 12), new OreDictStack(SA326.nugget(), 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new OreDictStack(GOLD.wireDense(), 8))); this.register(new GenericRecipe("ass.endobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_endo, 1)) .inputItems(new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.coil_gold, 4))); this.register(new GenericRecipe("ass.exobomb").setup(200, 100).outputItems(new ItemStack(ModBlocks.therm_exo, 1)) @@ -249,7 +372,8 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.mikecore").setup(1_200, 100).outputItems(new ItemStack(ModItems.mike_core, 1)) .inputItems(new OreDictStack(U238.nugget(), 24), new OreDictStack(PB.ingot(), 6))); this.register(new GenericRecipe("ass.mikedeut").setup(600, 100).outputItems(new ItemStack(ModItems.mike_deut, 1)) - .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16), new ComparableStack(ModItems.cell_deuterium, 10))); + .inputItems(new OreDictStack(IRON.plate528(), 12), new OreDictStack(STEEL.plate528(), 16)) + .inputFluids(new FluidStack(Fluids.DEUTERIUM, 10_000))); this.register(new GenericRecipe("ass.mikecooler").setup(300, 100).outputItems(new ItemStack(ModItems.mike_cooling_unit, 1)) .inputItems(new OreDictStack(IRON.plate528(), 8), new ComparableStack(ModItems.coil_copper, 5), new ComparableStack(ModItems.coil_tungsten, 5), new ComparableStack(ModItems.motor, 2))); this.register(new GenericRecipe("ass.fleijaigniter").setup(200, 100).outputItems(new ItemStack(ModItems.fleija_igniter, 1)) @@ -290,7 +414,50 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.plate_paa, 3), new OreDictStack(OreDictManager.getReflector(), 1), new ComparableStack(ModItems.coil_magnetized_tungsten, 3), new ComparableStack(ModItems.powder_power, 3))); this.register(new GenericRecipe("ass.bholegrenade").setup(1_200, 100).outputItems(new ItemStack(ModItems.grenade_black_hole, 1)) .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 6), new OreDictStack(OreDictManager.getReflector(), 3), new ComparableStack(ModItems.coil_magnetized_tungsten, 2), new ComparableStack(ModItems.black_hole, 1))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) + .inputItems()); + */ + // turrets + this.register(new GenericRecipe("ass.turretchekhov").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_chekhov, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretfriendly").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_friendly, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), new OreDictStack(STEEL.pipe(), 3), new OreDictStack(GUNMETAL.mechanism(), 1), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretjeremy").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_jeremy, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(STEEL.shell(), 3), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrettauon").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_tauon, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(CU.ingot(), 32), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.battery_lithium, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turretrichard").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_richard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.shell(), 8), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.turrethoward").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_howard, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 10), new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.maxwell").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_maxwell, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 24), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 4), new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.magnetron, 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.fritz").setup(200, 100).outputItems(new ItemStack(ModBlocks.turret_fritz, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel))); + this.register(new GenericRecipe("ass.arty").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_arty, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himars").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.turret_himars, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.himarssmall").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallhe").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_HE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallwp").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_WP)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new OreDictStack(P_WHITE.ingot(), 18), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 48), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalltb").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 32), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 12), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmallnuke").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_MINI_NUKE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_PLASTIC.ingot(), 24), new ComparableStack(ModItems.rocket_fuel, 48), new ComparableStack(ModItems.ball_tatb, 6), new OreDictStack(PU239.nugget(), 12), new OreDictStack(OreDictManager.getReflector(), 12), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarssmalllava").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.SMALL_LAVA)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 32), new ComparableStack(ModItems.ball_tatb, 4), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.circuit, 6, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.himarslarge").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.himarslargetb").setup(200, 100).outputItems(new ItemStack(ModItems.ammo_himars, 1, ItemAmmoHIMARS.LARGE_TB)) + .inputItems(new OreDictStack(STEEL.plate(), 24), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new ComparableStack(ModItems.rocket_fuel, 36), new ComparableStack(ModItems.ball_tatb, 24), new OreDictStack(Fluids.KEROSENE_REFORM.getDict(1_000), 16), new OreDictStack(Fluids.PEROXIDE.getDict(1_000), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED))); + // missile parts this.register(new GenericRecipe("ass.missileassembly").setup(200, 100).outputItems(new ItemStack(ModItems.missile_assembly, 1)) .inputItems(new OreDictStack(AL.shell(), 2), new OreDictStack(TI.shell(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.rocket_fuel, 8), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); @@ -328,7 +495,137 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) - .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new ComparableStack(ModItems.pipes_steel))); + .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new OreDictStack(STEEL.pipe(), 4))); + + /* + this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) + .inputItems()); + */ + + // weapons + this.register(new GenericRecipe("ass.schrabhammer").setup(6_000, 100).outputItems(new ItemStack(ModItems.schrabidium_hammer, 1)) + .inputItems( + new OreDictStack(SA326.block(), 35), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.billet_yharonite, 64), + new ComparableStack(ModItems.coin_ufo, 1), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64), + new ComparableStack(ModItems.fragment_meteorite, 64))); + + // ammo + this.register(new GenericRecipe("ass.50bmgsm").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_standard, 6, EnumAmmo.BMG50_SM.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 1, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 6), new OreDictStack(STAR.ingot(), 3)) + .setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "silverstorm")); + this.register(new GenericRecipe("ass.50bmgbypass").setup(100, 100).outputItems(new ItemStack(ModItems.ammo_secret, 12, EnumAmmoSecret.BMG50_BLACK.ordinal())) + .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) + .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + + // space + this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) + .inputItems(new OreDictStack(TI.shell(), 32), + new OreDictStack(RUBBER.ingot(), 64), + new ComparableStack(ModItems.rocket_fuel, 64), + new ComparableStack(ModItems.thruster_small, 12), + new ComparableStack(ModItems.thruster_medium, 12), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CONTROLLER), + new ComparableStack(ModItems.part_generic, 32, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.lander").setup(2_400, 100).outputItems(new ItemStack(ModItems.missile_soyuz_lander, 1)) + .inputItems(new OreDictStack(AL.shell(), 4), + new OreDictStack(RUBBER.ingot(), 16), + new ComparableStack(ModItems.rocket_fuel, 16), + new ComparableStack(ModItems.thruster_small, 3), + new ComparableStack(ModItems.circuit, 3, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.part_generic, 12, EnumPartType.LDE)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "soyuz")); + this.register(new GenericRecipe("ass.satellitebase").setup(600, 100).outputItems(new ItemStack(ModItems.sat_base, 1)) + .inputItems(new OreDictStack(RUBBER.ingot(), 12), + new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.thruster_large, 1), + new ComparableStack(ModItems.part_generic, 8, EnumPartType.LDE), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.photo_panel, 24), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.BASIC), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitemapper").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_mapper, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satellitescanner").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_scanner, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 8), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.magnetron, 8), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satelliteradar").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_radar, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 3), + new OreDictStack(TI.plateCast(), 12), + new ComparableStack(ModItems.magnetron, 12), + new ComparableStack(ModItems.coil_gold, 16), + new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()))); + this.register(new GenericRecipe("ass.satellitelaser").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_laser, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 6), + new OreDictStack(CU.plateCast(), 24), + new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.CONTROLLER_ADVANCED), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.crystal_diamond, 8), + new ComparableStack(ModBlocks.glass_quartz, 8))); + this.register(new GenericRecipe("ass.satelliteresonator").setup(600, 100).outputItems(new ItemStack(ModItems.sat_head_resonator, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), + new OreDictStack(STAR.ingot(), 12), + new OreDictStack(ANY_PLASTIC.ingot(), 48), + new ComparableStack(ModItems.crystal_xen, 1), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.satelliterelay").setup(600, 100).outputItems(new ItemStack(ModItems.sat_foeq, 1)) + .inputItems(new OreDictStack(TI.shell(), 3), + new ComparableStack(ModItems.plate_desh, 8), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.HYDROGEN.getID()), + new ComparableStack(ModItems.photo_panel, 16), + new ComparableStack(ModItems.thruster_nuclear, 1), + new ComparableStack(ModItems.ingot_uranium_fuel, 6), + new ComparableStack(ModItems.circuit, 24, EnumCircuitType.BASIC), + new ComparableStack(ModItems.magnetron, 3), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satelliteasteroidminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_miner, 1)) + .inputItems(new OreDictStack(BIGMT.plate(), 24), + new ComparableStack(ModItems.motor_desh, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 12, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModItems.centrifuge_element, 4), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.satellitelunarminer").setup(600, 100).outputItems(new ItemStack(ModItems.sat_lunar_miner, 1)) + .inputItems(new ComparableStack(ModItems.ingot_meteorite, 4), + new ComparableStack(ModItems.plate_desh, 4), + new ComparableStack(ModItems.motor, 2), + new ComparableStack(ModItems.drill_titanium, 2), + new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), + new ComparableStack(ModItems.fluid_barrel_full, 1, Fluids.KEROSENE.getID()), + new ComparableStack(ModItems.thruster_small, 1), + new ComparableStack(ModItems.photo_panel, 12), + new ComparableStack(ModBlocks.machine_lithium_battery, 1))); + this.register(new GenericRecipe("ass.gerald").setup(6_000, 100).outputItems(new ItemStack(ModItems.sat_gerald, 1)) + .inputItems(new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(SBD.plateCast(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new OreDictStack(BSCCO.wireDense(), 64), + new ComparableStack(ModBlocks.det_nuke, 64), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.part_generic, 64, EnumPartType.HDE), + new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), + new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java index f2c8dfd42..eff9d27a8 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipe.java @@ -31,11 +31,22 @@ public class GenericRecipe { protected ItemStack icon; public boolean writeIcon = false; public boolean customLocalization = false; + protected String[] blueprintPools = null; public GenericRecipe(String name) { this.name = name; } + public boolean isPooled() { + return blueprintPools != null; + } + + public boolean isPartOfPool(String lookingFor) { + if(!isPooled()) return false; + for(String pool : blueprintPools) if (pool.equals(lookingFor)) return true; + return false; + } + public GenericRecipe setDuration(int duration) { this.duration = duration; return this; } public GenericRecipe setPower(long power) { this.power = power; return this; } public GenericRecipe setup(int duration, long power) { return this.setDuration(duration).setPower(power); } @@ -45,6 +56,7 @@ public class GenericRecipe { public GenericRecipe setIcon(Item item) { return this.setIcon(new ItemStack(item)); } public GenericRecipe setIcon(Block block) { return this.setIcon(new ItemStack(block)); } public GenericRecipe setNamed() { this.customLocalization = true; return this; } + public GenericRecipe setPools(String... pools) { this.blueprintPools = pools; for(String pool : pools) GenericRecipes.addToPool(pool, this); return this; } public GenericRecipe inputItems(AStack... input) { this.inputItem = input; return this; } public GenericRecipe inputFluids(FluidStack... input) { this.inputFluid = input; return this; } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java index 4738b449a..1cb5cadb2 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/GenericRecipes.java @@ -32,8 +32,20 @@ public abstract class GenericRecipes extends Serializab public static final Random RNG = new Random(); + /** Alternate recipes, i.e. obtainable otherwise */ + public static final String POOL_PREFIX_ALT = "alt."; + /** Discoverable recipes, i.e. not obtainable otherwise */ + public static final String POOL_PREFIX_DISCOVER = "discover."; + /** Secret recipes, self-explantory. Why even have this comment? */ + public static final String POOL_PREFIX_SECRET = "secret."; + public List recipeOrderedList = new ArrayList(); public HashMap recipeNameMap = new HashMap(); + + /** Blueprint pool name to list of recipe names that are part of this pool */ + public static HashMap> blueprintPools = new HashMap(); + /** Name to recipe map for all recipes that are part of pools for lookup */ + public static HashMap pooledBlueprints = new HashMap(); public abstract int inputItemLimit(); public abstract int inputFluidLimit(); @@ -41,6 +53,21 @@ public abstract class GenericRecipes extends Serializab public abstract int outputFluidLimit(); public boolean hasDuration() { return true; } public boolean hasPower() { return true; } + + public static void addToPool(String pool, GenericRecipe recipe) { + List list = blueprintPools.get(pool); + if(list == null) { + list = new ArrayList(); + blueprintPools.put(pool, list); + } + list.add(recipe.name); + pooledBlueprints.put(recipe.name, recipe); + } + + public static void clearPools() { + blueprintPools.clear(); + pooledBlueprints.clear(); + } @Override public Object getRecipeObject() { @@ -75,6 +102,7 @@ public abstract class GenericRecipes extends Serializab if(obj.has("icon")) recipe.setIcon(this.readItemStack(obj.get("icon").getAsJsonArray())); if(obj.has("named") && obj.get("named").getAsBoolean()) recipe.setNamed(); + if(obj.has("blueprintpool")) recipe.setPools(obj.get("blueprintpool").getAsString().split(":")); readExtraData(element, recipe); @@ -123,6 +151,7 @@ public abstract class GenericRecipes extends Serializab } if(recipe.customLocalization) writer.name("named").value(true); + if(recipe.blueprintPools != null && recipe.blueprintPools.length > 0) writer.name("blueprintpool").value(String.join(":", recipe.blueprintPools)); writeExtraData(recipe, writer); } diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index f633298f1..8fa127907 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -106,6 +106,8 @@ public abstract class SerializableRecipe { MainRegistry.logger.info("Starting recipe init!"); + GenericRecipes.clearPools(); + for(SerializableRecipe recipe : recipeHandlers) { recipe.deleteRecipes(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 251e2d396..f6afda0e0 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -553,7 +553,7 @@ public class ModItems { public static Item coil_copper; public static Item coil_copper_torus; public static Item coil_tungsten; - public static Item tank_steel; + @Deprecated public static Item tank_steel; public static Item motor; public static Item motor_desh; public static Item motor_bismuth; @@ -566,8 +566,6 @@ public class ModItems { public static Item coil_magnetized_tungsten; public static Item coil_gold; public static Item coil_gold_torus; - public static Item component_limiter; - public static Item component_emitter; public static Item chlorine_pinwheel; public static Item deuterium_filter; @@ -1183,6 +1181,7 @@ public class ModItems { public static Item radar_linker; public static Item settings_tool; + public static Item blueprints; public static Item template_folder; public static Item journal_pip; public static Item journal_bj; @@ -2716,8 +2715,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"); - 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"); FluidTank.noDualUnload.add(chlorine_pinwheel); ring_starmetal = new Item().setUnlocalizedName("ring_starmetal").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ring_starmetal"); @@ -4103,6 +4100,7 @@ public class ModItems { mech_key = new ItemCustomLore().setUnlocalizedName("mech_key").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":mech_key"); + blueprints = new ItemBlueprints().setUnlocalizedName("blueprints").setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":blueprints"); template_folder = new ItemTemplateFolder().setUnlocalizedName("template_folder").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":template_folder"); journal_pip = new ItemTemplateFolder().setUnlocalizedName("journal_pip").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_pip"); journal_bj = new ItemTemplateFolder().setUnlocalizedName("journal_bj").setMaxStackSize(1).setCreativeTab(MainRegistry.templateTab).setTextureName(RefStrings.MODID + ":journal_bj"); @@ -5521,10 +5519,6 @@ public class ModItems { //GameRegistry.registerItem(telepad, telepad.getUnlocalizedName()); GameRegistry.registerItem(entanglement_kit, entanglement_kit.getUnlocalizedName()); - //AMS Parts - GameRegistry.registerItem(component_limiter, component_limiter.getUnlocalizedName()); - GameRegistry.registerItem(component_emitter, component_emitter.getUnlocalizedName()); - //Bomb Parts GameRegistry.registerItem(fins_flat, fins_flat.getUnlocalizedName()); GameRegistry.registerItem(fins_small_steel, fins_small_steel.getUnlocalizedName()); @@ -5748,6 +5742,7 @@ public class ModItems { GameRegistry.registerItem(fusion_core_infinite, fusion_core_infinite.getUnlocalizedName()); //Folders + GameRegistry.registerItem(blueprints, blueprints.getUnlocalizedName()); GameRegistry.registerItem(template_folder, template_folder.getUnlocalizedName()); GameRegistry.registerItem(journal_pip, journal_pip.getUnlocalizedName()); GameRegistry.registerItem(journal_bj, journal_bj.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/machine/ItemBlueprints.java b/src/main/java/com/hbm/items/machine/ItemBlueprints.java new file mode 100644 index 000000000..84976e8c5 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBlueprints.java @@ -0,0 +1,132 @@ +package com.hbm.items.machine; + +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.recipes.loader.GenericRecipe; +import com.hbm.inventory.recipes.loader.GenericRecipes; +import com.hbm.items.ModItems; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemBlueprints extends Item { + + @SideOnly(Side.CLIENT) protected IIcon iconDiscover; + @SideOnly(Side.CLIENT) protected IIcon iconSecret; + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.iconDiscover = reg.registerIcon(this.getIconString() + "_discover"); + this.iconSecret = reg.registerIcon(this.getIconString() + "_secret"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconIndex(ItemStack stack) { + return this.getIcon(stack, 0); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + + if(stack.hasTagCompound()) { + String poolName = stack.stackTagCompound.getString("pool"); + if(poolName == null) return this.itemIcon; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_DISCOVER)) return this.iconDiscover; + if(poolName.startsWith(GenericRecipes.POOL_PREFIX_SECRET)) return this.iconSecret; + } + + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + for(Entry> pool : GenericRecipes.blueprintPools.entrySet()) { + list.add(make(pool.getKey())); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + if(!player.inventory.hasItem(Items.paper)) return stack; + + player.inventory.consumeInventoryItem(Items.paper); + player.swingItem(); + + ItemStack copy = stack.copy(); + copy.stackSize = 1; + + if(!player.capabilities.isCreativeMode) { + if(stack.stackSize < stack.getMaxStackSize()) { + stack.stackSize++; + return stack; + } + + if(!player.inventory.addItemStackToInventory(copy)) { + copy = stack.copy(); + copy.stackSize = 1; + player.dropPlayerItemWithRandomChoice(copy, false); + } + + player.inventoryContainer.detectAndSendChanges(); + } else { + player.dropPlayerItemWithRandomChoice(copy, false); + } + + return stack; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.RED + "Right-click to copy (requires paper)"); + + if(!stack.hasTagCompound()) { + return; + } + + String poolName = stack.stackTagCompound.getString("pool"); + List pool = GenericRecipes.blueprintPools.get(poolName); + + if(pool == null || pool.isEmpty()) { + return; + } + + for(String name : pool) { + GenericRecipe recipe = GenericRecipes.pooledBlueprints.get(name); + if(recipe != null) { + list.add(recipe.getLocalizedName()); + } + } + } + + public static String grabPool(ItemStack stack) { + if(stack == null) return null; + if(stack.getItem() != ModItems.blueprints) return null; + if(!stack.hasTagCompound()) return null; + if(!stack.stackTagCompound.hasKey("pool")) return null; + return stack.stackTagCompound.getString("pool"); + } + + public ItemStack make(String pool) { + ItemStack stack = new ItemStack(ModItems.blueprints); + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setString("pool", pool); + return stack; + } +} diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 5b9d63062..756760d15 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1714,6 +1714,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.chopper_tail"); ignoreMappings.add("hbm:item.chopper_wing"); ignoreMappings.add("hbm:item.chopper_blades"); + ignoreMappings.add("hbm:item.component_emitter"); + ignoreMappings.add("hbm:item.component_limiter"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java index 7787b4fbd..9815c0803 100644 --- a/src/main/java/com/hbm/module/machine/ModuleMachineBase.java +++ b/src/main/java/com/hbm/module/machine/ModuleMachineBase.java @@ -3,6 +3,7 @@ package com.hbm.module.machine; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes.IOutput; +import com.hbm.items.machine.ItemBlueprints; import api.hbm.energymk2.IEnergyHandlerMK2; import cpw.mods.fml.common.network.ByteBufUtils; @@ -130,8 +131,16 @@ public abstract class ModuleMachineBase { public abstract GenericRecipe getRecipe(); - public void update(double speed, double power, boolean extraCondition) { + public void update(double speed, double power, boolean extraCondition, ItemStack blueprint) { GenericRecipe recipe = getRecipe(); + + if(recipe != null && recipe.isPooled() && !recipe.isPartOfPool(ItemBlueprints.grabPool(blueprint))) { + this.didProcess = false; + this.progress = 0F; + this.recipe = "null"; + return; + } + this.setupTanks(recipe); this.didProcess = false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java index 508259c48..2ad98b8c0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblyMachine.java @@ -104,7 +104,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; - this.assemblerModule.update(speed, pow, true); + this.assemblerModule.update(speed, pow, true, slots[1]); this.didProcess = this.assemblerModule.didProcess; if(this.assemblerModule.markDirty) this.markDirty(); @@ -266,6 +266,7 @@ public class TileEntityMachineAssemblyMachine extends TileEntityMachineBase impl @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades if(this.assemblerModule.isItemValid(slot, stack)) return true; // recipe input crap return false; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java index 62b9f0a68..dfcd1c50d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalFactory.java @@ -10,6 +10,7 @@ import com.hbm.inventory.container.ContainerMachineChemicalFactory; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemicalFactory; +import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; @@ -101,6 +102,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + for(int i = 0; i < 4; i++) if(slot == 4 + i * 7 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 1 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades for(int i = 0; i < 4; i++) if(this.chemplantModule[i].isItemValid(slot, stack)) return true; // recipe input crap return false; @@ -163,7 +165,7 @@ public class TileEntityMachineChemicalFactory extends TileEntityMachineBase impl boolean markDirty = false; for(int i = 0; i < 4; i++) { - this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool()); + this.chemplantModule[i].update(speed * 2D, pow * 2D, canCool(), slots[4 + i * 7]); this.didProcess[i] = this.chemplantModule[i].didProcess; markDirty |= this.chemplantModule[i].markDirty; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java index 47e0a7d62..6a21f07de 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemicalPlant.java @@ -110,7 +110,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem pow += Math.min(upgradeManager.getLevel(UpgradeType.SPEED), 3) * 1D; pow += Math.min(upgradeManager.getLevel(UpgradeType.OVERDRIVE), 3) * 10D / 3D; - this.chemplantModule.update(speed, pow, true); + this.chemplantModule.update(speed, pow, true, slots[1]); this.didProcess = this.chemplantModule.didProcess; if(this.chemplantModule.markDirty) this.markDirty(); @@ -232,6 +232,7 @@ public class TileEntityMachineChemicalPlant extends TileEntityMachineBase implem @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { if(slot == 0) return true; // battery + if(slot == 1 && stack.getItem() == ModItems.blueprints) return true; if(slot >= 2 && slot <= 3 && stack.getItem() instanceof ItemMachineUpgrade) return true; // upgrades if(slot >= 10 && slot <= 12) return true; // input fluid if(slot >= 16 && slot <= 18) return true; // output fluid diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 50aa4a009..7def2090a 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1416,6 +1416,7 @@ item.blades_schrabidium.name=Schrabidiumsägeblatt item.blades_steel.name=Stahlsägeblatt item.blades_titanium.name=Titansägeblatt item.blowtorch.name=Lötlampe +item.blueprints.name=Blaupausen item.board_copper.name=Kupfertafel item.boat_rubber.name=Schlauchboot item.bobmazon.name=Bobmazon diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index cb32c226e..0d27f7c80 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2160,6 +2160,7 @@ item.blades_desh.name=Desh Shredder Blades item.blades_steel.name=Steel Shredder Blades item.blades_titanium.name=Titanium Shredder Blades item.blowtorch.name=Blowtorch +item.blueprints.name=Blueprints item.board_copper.name=Copper Panel item.boat_rubber.name=Rubber Boat item.bobmazon.name=Bobmazon diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assembler.png index dc9f7034bfa3723926a9e3a087278070caec4777..3101c24f903633853b12ac0e0fc9f60d57105786 100644 GIT binary patch literal 3490 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 literal 3445 zcma)8cT|(f9-WjWu@J(lfEekDpdw0FkSIh%SwIwpm6EtfwIEHZ1X)2rz!gDQk**+J zlp0E0mJTLJ4J}}#mkJ>nLUvnc&QrH6I1yH(Fx%n`m*2WLwCXvW0$(}DG|CcR*RF@{7=t)YmF zp72e$bMk@moyxtVzhO=`?If6`OGvIHZZL(g2|4c)#~rFAnSTDh(~S`pWdF*o%=S?x zjq5E@YtLTo*6oi!xiP}ddmUxFthnAXNLgP9WVKB+8w(+4#kJRt$IfFP3JD4I9mo01 ze`(};pA4v|9HNMp`Yp^w&ChT-E-N2%tW5ev#C1iy?{P1AEn~t?CwJBzktr-H+Lv!r z8AeDK<=csY=NdwRY3Xelt(}7}O4t-ljOH|VEqHo*y1`Y`s$<8KHb=X4@6-cNi;C2C zN7diC(Tm`%R%ZzDS50aV3v{EIHs0HYaqdVNVG>*Xq)c{;b3i4Dz2gm;_ zk71TyqgKO1#&)xp3Ho-*VuuFYl_lT@3}#Y9x_uwL)*}xJy^(GedTqdxgoE7h)XZPr zRikyl#SRH)Ege36QM!eQp>BtfjbA1tG}s-Bzh`~-G@YkNc7rDD#)LAO$wikxzoPJE zWKLmQRC(ok@DO01sq%e>y%1#^UWxs${Szb}x5@ZY}05E(SsLuC{(OBHO)f9>Z9c6GBGYimzr zG;LuITCPPX$8Jz*g(A7zh-jicX(l(Hsp1=)n?Kw9ZO)yWxT)y!DG>W|z~s=cI6E{k zq&K*G92S?dG^92PTCiYFTo0&pNL18esoRTC`E3Ygy_pX#EwDIgFr@Y^lF$MEe0bTI z%{njSfsw*Ds*%k~KbDtz%MYhTL`K%>Z~;VrPW)Ru-VxH|-OfTbKcR`Em%CA9|K;j6 znPt86QIa=R=M`GbITIOuXZY{a1P-0IpQmgfQxDd+y^qrZvPd#v;+=QfZtM0tJya~! z$Z0c{Xeg3B)sI|8-b?q<2P*=YhAj6H%^Rfe>Cm{fRfWpn19?Vc{VTT{N75CXiROEl zscgehn8XnaAyY4$xeXgp$Fc7b&b)4jmW$dkVIF86$>yX*{MMZ_>8)$BraKCZut_3^ zj@P`dXEDYmt4vajEwkO0L`i63Sns>^a~hS6DjuDMm)~&0mA5#Cc><9#uhx5=;??LW zU~~ZyyYHvPyn0r4507AhB8CBSw-_8c+8<3lR%mr|QtV@6S&8d}((R66y;BzLg6$86 z&%7wz3gy5Zf3bwvUV0HbwV8v%nQoVh%cyTAn@&monSjj{<-y}f(oe4E88wv^A9$m{ zsi!^Oa5C_}tXfu)rP>%f(A4*!E~()j`Rwnxtg8Y#P$q2z8Q6xt66T^njLu2Pzz|g^ z%cg#6*Y&6wbx$+SNtHg%2KF7ZXb9n$Z*HB-tkSi;d-}6`LmgU?mvR?X>e7j~3#3^OTxk3H$-0aJ;J)ZV^p1A}KedTo47Wu0n z@dR^P7(-y>lequ$$X5!Gj!65Gult1GE-wg+u>InTCeE9ja0WI%eNW$%+ffuT1UP<3 zJppG_jWDvj_yql`^{Xbg9vSf$&7!ik1JBFZd{#TZUR`Xnu)v=(f1?Yh!iEP<3?5Mk zNkWq`kVM?C-N*V0gTn_VH%dH5ZAT7&Aci!P$=8tN>q;}|-(3-wkh1brH}t=DeIcXW zLDwaxwF%Fa*Q|xC>xawbwpgRVHW9Ug^tZ3~Odcbda(}IuZ->Rh!!jwMJ0^y%D zSmT9lWo|fEAs8|Kpy0O%4uBA4`LZCF@#RrL3e5z#sJmm}Ux_ zZ1S7(vkyf2A}JXO8!D(+#qc20X$TiR^0*0IV|ri8as1&E0-$EytG>(zDTg}Z{?*K+ZOHe*0H0kLp?eDL0kx){h77WoGe~$A zTfiMSS`RW3CGZ+O!swU8Pc*?-FnUMCL92r(Dr6C$77cORWDCGfSwPQ9Z4Mx8`vW90!K;68tFp=ct92RLb};Hf%Mxa%M^dDP!n6csDy^AFSsTwUJW+qth{57=vJ?L z9%L_sGXvYlolj4qPO=n1vKR~;I0HbKFxd5jQhxbKWbz#(UhrpdSrBHrLz--!>LvZe zP%qKSM$Ic1H~w@7j9#ZUtIo`D$~M!TSmaNVN-ZNKLH z)G^ZYUSJ^-QC(FL#g9Cb_GxTl3v>{fL3Py?sV{Rt>_|_en<)NTNZa9FxKa=q5sC+qp<%`L4?qk_yIM zdJKd>S6speR4~keFT&NAlXzLRQ#gJV$NMtxyzh2xXUEt;Q3q{e1tlyD-5E07fhta% z;o+2rXNS|ReJ=;Ll~y&4P}3iCyc6zfXQsql4bD}ZL{(5_@Qn}8pwX`VA(XfTTHLCwV!Ef%$vzq!4VY-0^DH*l)F-m*Y_qp zJ|p`}U_^#(lH`VAqK=>XazBG%DH=NVa-dQ^;sJiJcZ18Q9QWzb*a524H{QHUuw+$? z70|o7Vy9>KT1;(`qdjV2iak>a^gGuL<8i|urk>r9)(F&haBwK2t#DO56~bgJuU?HF zs6;Rr45###R4thOD&?XWfYkYmZBt|8BjhQfm2q@wmDQo`dM?%Z+;Z}CB;JQsQ}tjK z7MFNbKH6|bH#4i5@Wam}N2@x;-v0jgz2~nPNR?<(q|aI+TKkT^X0n@;0@Y5ueYTA2 zt&hadx~YSvpGk4622Z=GPTX5W11Sw33iiMjSZVm)p#Cv)V6;CvKEFoUZmH*vzX%N$Fv?9+}o3n$kxbD_r$xBj3V z^sJa?(^@9G%YJW`OAh$B4D@e({OZ9EviE62oTc+9R~)vfMqB!KA>P-7OMtanb5Nqi zL^K$GJ&K~|+JzEx1djNEi7iy_E?8+qHkjSqFu9FF(!_ln5KW$5We7Li97IA3HzPU* zpufMhwKY!&p*5L@h^va+8e zF=MQ&H7a-gc%gD(b-d09XzThaQv6KpTwKDVuEDpqEP_0}A$(U?SGlHyrk%D#^FmsN zO815(s^CYrP+*A0m%J`UhEleU0p5t7-Ns|vyL<8NV!x`p_@Z)eToGyzhcvr#*CLz} zry(9yPpA(L`xGOp;fX-!BtET6df1nsk;>6XYoEncn7w*iw6d(nLP0NEsE`TvN(e8n zop>E9m}7&7v?;EAV>r|%U;Z>&^>ZwpHyppP;4bW&6ESYMAMmWyt?qhw$jQW9mcJGh zZyn^cMpm-9u?<7T{KtR($BzEiJ;%mWl$1EE3H0^#x%vAWX+3-Ap(P}tt*nGvIfuZ1 z`6^1h78qz785N}v>K3aMYVxMH2K#Sw`y1MSS>NAA&n+W*1_xu;*8^A@DY&Mf7rrvz z*WWoLvrvL^Fpz4xlac^Q+`zy0Oe+isqg{nhz|}&f|6Cel z3@<#WJW^_E>~)2x8fqP+P`~09mr(rIIl|EO^UrsK&>+Ioq$@;k2=2w785oL5UyZWw z7x~2|zdM{pqrI`h$ETy{eLX$nTs--B9Jq0&7|t?|gl9(8G0A)cCb~G}_oe>vO|2Oc LjP>(Q6Yu{E9d9*S diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemical_factory.png index 7e6aa8347e4fff3bda07f1e73bea1f64835e6b4c..ae4a7ef6dfebea7a10da1bbe415b94fcc2daca3b 100644 GIT binary patch literal 3644 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 E0rwknW&i*H literal 3531 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 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_chemplant.png index d58713d9c3f848312cd58d877fd04d93f618154d..3ce1bc32c7c7bc336caa829c6559d5caf3a9c325 100644 GIT binary patch literal 3594 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 AKmY&$ literal 3535 zcma)8c|6ox8~^=gX@)n$6mh4qMcFE3Ez1nqNwTM6sH{n(!N|}iA$8jX6!xQqE z*NFnc#)&W!jx4)I+E}8ozcPG$jM}!s1vlCW&jybdSFBXdRreonDf+UZkXLkN{fi@u(HTSf@DTS_fRyEJ#pzqkkUcekIBivBedf; zBnjyOErLB=-BZK6x+|#jC~oNTe0Ibp_EKYsB;-;c)4I=Yk>3VhEf6SQP;JpMzX z8#S4BSb0T%5BRc*I`1ckTFSgT7%@Amb?g-Ca@w);eu9$v&sx2o`OA{}C(9>CldX1? zmX&!qIXQ(%=)mT=)n5fyxGjGPa11P4`+FNS`xz~X10QPz^w9mKpZxWjT z7p-KgTd7O0#lX646m$@I(w|Lxd>Kc?Zvyt6qfmU`4FxZs^EOafP>ecjBxqogb!c)A ziIo-_R~xAYK~@JduUhjZ!Rn+b-VXOpYT_}8=``_)bHiXf&?lsaP^b{3$3kX7H$_d6 z(z#%rG)Oe;DgdoO-tKdsIWW|8hV^`BQ~Bn{GSK}g<%0AvF3=2FDjopbUcQW3Msm3! z-=?PS+Usm-y|Q~&S^}sgGqVTNmjZ`IGM2|g z$zeY%^3(22J7-f%uo)~aFzh(zRVso?hShc8D*G^YbF;pq4>H@8OXk(DV~MGMW@-@_ z=f%o8Z@TE@<<45}(swunk9p?|Gdt&b$WKnBgql~MqxcXAyk%Ofol_WYvc4!M47t&m zl|weM)nVlE4&H~J@|#L;)qRc3)x#TY#`li;JMxl3kPn6H0I6vIkhaR5maC? zh5}N=eA%16;ldoBBh~^^{2Ecjc*HXmWK4hQ29=1VhmPTlj7KyCdAoka#cib2N3BOX z4ESTc5)OE6Dk0mhBBhuJNLf!I4LoDdT9l9tTYBSUqU$ppMx64=WaDLmFQA$WA}kyb z_9N_~1OycGz$5TnnfjXI_Tsc+&;}9zM+6`eIKVa%kiyLUhcFj_JRXd3sc!4D6M=+k z16&^RG{5{mypFC)A+sul!$%a4vFR$~{GU?p;YlectnthFKE+=|>eJ`#>|2edeLY$V zqY-uQXDFadfE*|2r@?>Q{u8woQd{N3HS1l~i9u*f@`Rs%D9mif^qP-inSG0@1I?>Hx3)<|bqQ-AKlD^@K4$LdhnjdmhB@Os z8!%mWJ3(D{en5MRJ)&^W%c7v~4r@;aMY-sN$Y=D$uLH0eVu@HD3(3Lb#&k1_CEIwx zXGl@dE3wmKT_X6dLiC*^o>=f*hY~@%=Di}EpE4QDIb-EjdD(z+$z;RjckezFl4HAu zCD$$|(leJZ>x|7s@|X+0sEs8G*o`>RCL5nNN7uUhRSSNCHVu52e0B8S4YlcWzcF$( zpYn=lhIgDz-P2rw!>Mi!%_Z+U`832fW>Trz_|8yW>t`DB+dy?A|7;mYt3US10>K`8 zl6OXk>(~R2xTg#0L`o2Kaaan+= zx(VnN;{(pbBcdGrUwkYZ+90hSHwUAiqm99dTr*%0fqJ=N6M%zgFIa45iYhB-MjGUY zWMrR`dvEH7%?MheX4LD}AtThC#Ygm?=8uq57Q7$tJ54!Hzh3Yw1U++TMC(`p>?WR1 z3NQz>1o)(cpy3*4>je+YXK1gn=q~(N5Dj2e)pJ)w1CZS_x+z~Z!OQ72qNW>Dmquvf zz4bR1JE7GtnqXUfjpXSrPGm!W;LvnDqSF9|X4bg%JQRd?%($4qMtc>B#`wigJ8n0= zJ*@wEKf(BXQW?5;B1Lj)9H(c+6gInbdq%&9Kc{ z@EcB*nv7hJjohnj-U z4`!tAsU5?pOF;tx2ZthnikYiPRy)26R&-x`)6&A$FSCpoetTlilgdgx$lMod3#{G_ zJWK)JFOQwF0{SPl8zsNY%(N{mQG<090wcm0JDYIa@Lk=aHb=4EUDMv(?OO2qbk&@9 zc}HO?;T2iO-!F0Jwu*0mvhC)*t<$HOH6&8x@|PfYpRTjsl1i|lTNc3m{nLHcPsf0- zbT%`VnDSs#)Zq`TRJALm9)`+qrkkofWmySnRhw0s_V82sLY1R5pJR!w!TXNkM1-r; zw}Wql7o4$XHx|)SO?zn8Ii97I3FWG2wJQ?c|DqqHB7j{`uOiyx>JBw4ijjIsF!S4z zAmE*_h$aPoAkZ*pHXjTzyoZldUx?1xAY`<5*JL7%K)@FetRqCOGge6 z4ch>gSP^XSHV!;-*mG{YXPlyDM6gg(S|k&LDEviayelav5BrXl}^|4(({*?b10lx^f%DnIK>$fMFZ%Se4T9GKD0WH{y7BJ2?+}F@Vq-_UAM)u0Csi)UiEmV_FBQGQCqK89mV$e;va$x6d915Kv40JM+3Q{GbeH+z}PjQBpKXcrT=>sv}x4^Q?`05Xfn!RJtlx zmzPVGN2xKe#BnH)X{XUb7hxn^Jur}V3MrIuiEv>B&f@zhvCKAH%{g;pYoj7V(#3xR DKjunf diff --git a/src/main/resources/assets/hbm/textures/items/blueprints.png b/src/main/resources/assets/hbm/textures/items/blueprints.png new file mode 100644 index 0000000000000000000000000000000000000000..225bec283a40a368b2fe88ed70f545c848ca102b GIT binary patch literal 379 zcmV->0fhdEP)3b->*B=6m`_w6kFQPHsh=bUSYqiAowd(3!w`|SM- zA$!EZVBnNe0N89qnrwU8z~u4TOVZh;JLeqzG1gkFwW#+8w4tpuX%cyBg;C{1{dy08 zQVN@m+7xNxC+SS4AI#=Uuc-~tA2(}klBCJD4=|fAn>+dZDxEPalH`P&yEktLfT^FP z$cF%wdePj0n2lLcg_# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_discover.png b/src/main/resources/assets/hbm/textures/items/blueprints_discover.png new file mode 100644 index 0000000000000000000000000000000000000000..66cdcea650c4eb892facdfd28145531b98aae877 GIT binary patch literal 397 zcmV;80doF{P)gJZI z8f4uWChFVZKrLhn(aO@KsuScc{lnOj?Pq#-@4fH+-u2**(tb(^!&NEQlgWK6|6718 z91O12*>3mQg0ujm(WumQ9e^P4NYjmqnWo)>s71A-<2(YO>pDT;DL|TTS`e*iRd#gU zw_iazLc9}2+gi{xZG?CMpePEa(>ZCnQE`AM+7gDVQuDm0GD!|tRv*`OYDqwA9N!lJ z?Drq1J6J3pO3Uiggj6rC3K05FU$0G(=ak{s}Tp~f&x8{ZeqW_KKqM~b4rFuE8< zmn_T4vi$THs$@0!asP r9AAEk64G=aJ2rLpP(m&h{+qr4spP$PtFypF00000NkvXXu0mjf)by^B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/blueprints_secret.png b/src/main/resources/assets/hbm/textures/items/blueprints_secret.png new file mode 100644 index 0000000000000000000000000000000000000000..9abb970571fc173b44a8a56657a9e92cd66fc43d GIT binary patch literal 313 zcmV-90mlA`P)2t*>Om%54B| zz!Y~R7%PbbBm@XU7WMcf%fOq_y-;J%>Yo7&0GK&m%=6r=X#gT(r4#@_tre$rjk%x0 zp@C#TbR5SK08mOntu+cx>)JrNt*UqYKA&HLbVOvT3TBQ;k8E-|9%CEnJpR;)$N(5K z+wU+KGe?SuiHI%BV$5v+#*tw_M93!j;Ic{I_W%GQY7Mf9r+1pB$wb76DC&^zNCVlX z1AOeDFaMmXYQ7DBZdLPGRqtNH8 Date: Mon, 14 Jul 2025 20:31:54 -0500 Subject: [PATCH 40/45] add dyable cable color functionality to paintable network cable --- .../BlockOpenComputersCablePaintable.java | 116 +++++++++++++++++- .../java/com/hbm/handler/CompatHandler.java | 84 +++++++++---- .../hbm/textures/blocks/oc_cable_base.png | Bin 624 -> 612 bytes .../hbm/textures/blocks/oc_cable_color.png | Bin 0 -> 111 bytes .../hbm/textures/blocks/oc_cable_overlay.png | Bin 340 -> 139 bytes 5 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index b755006d5..915fb58f0 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,6 +2,8 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ILookOverlay; +import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -13,7 +15,9 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -29,10 +33,16 @@ import li.cil.oc.api.Network; import li.cil.oc.api.network.Visibility; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.Loader; +import li.cil.oc.api.network.SidedEnvironment; +import net.minecraftforge.common.util.ForgeDirection; +import li.cil.oc.api.internal.Colored; +import com.hbm.handler.CompatHandler.OCColors; +import net.minecraftforge.oredict.OreDictionary; public class BlockOpenComputersCablePaintable extends BlockContainer implements IToolable, IBlockMultiPass { @SideOnly(Side.CLIENT) protected IIcon overlay; + @SideOnly(Side.CLIENT) protected IIcon overlayColor; public BlockOpenComputersCablePaintable() { super(Material.iron); @@ -48,6 +58,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements public void registerBlockIcons(IIconRegister reg) { this.blockIcon = reg.registerIcon(RefStrings.MODID + ":oc_cable_base"); this.overlay = reg.registerIcon(RefStrings.MODID + ":oc_cable_overlay"); + this.overlayColor = reg.registerIcon(RefStrings.MODID + ":oc_cable_color"); } @Override @@ -61,13 +72,29 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(pipe.block != null) { if(RenderBlockMultipass.currentPass == 1) { return this.overlay; + } else if(RenderBlockMultipass.currentPass == 2) { + return this.overlayColor; } else { return pipe.block.getIcon(side, pipe.meta); } } } - return RenderBlockMultipass.currentPass == 1 ? this.overlay : this.blockIcon; + return RenderBlockMultipass.currentPass == 1 ? this.overlay : RenderBlockMultipass.currentPass == 2 ? this.overlayColor : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + if (RenderBlockMultipass.currentPass == 2) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + if (tile == null) + return 0xffffff; + + return tile.getColor(); + } + + return 0xffffff; } @Override @@ -75,7 +102,10 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements ItemStack stack = player.getHeldItem(); - if(stack != null && stack.getItem() instanceof ItemBlock) { + if (stack == null) + return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); + + if (stack.getItem() instanceof ItemBlock) { ItemBlock ib = (ItemBlock) stack.getItem(); Block block = ib.field_150939_a; @@ -95,6 +125,21 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements } } } + } else { + boolean isDye = false; + int[] dicts = OreDictionary.getOreIDs(stack); + for (int dict : dicts) { + String dictName = OreDictionary.getOreName(dict); + if (dictName.equals("dye")) + isDye = true; + } + + if (isDye) { + TileEntityOpenComputersCablePaintable tile = (TileEntityOpenComputersCablePaintable) world.getTileEntity(x, y, z); + tile.setColor(OCColors.fromDye(stack).getColor()); + world.markBlockForUpdate(x, y, z); + tile.markDirty(); + } } return super.onBlockActivated(world, x, y, z, player, side, fX, fY, fZ); @@ -123,7 +168,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements @Override public int getPasses() { - return 2; + return 3; } @Override @@ -131,9 +176,12 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements return IBlockMultiPass.getRenderType(); } - // WHY the fuck is this not compiling - @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers")}) - public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment { + @Optional.InterfaceList({ + @Optional.Interface(iface = "li.cil.oc.api.network.Environment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputers"), + @Optional.Interface(iface = "li.cil.oc.api.network.Colored", modid = "OpenComputers") + }) + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored { protected Node node; protected boolean addedToNetwork = false; @@ -142,6 +190,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements private int meta; private Block lastBlock; private int lastMeta; + private OCColors color = OCColors.LIGHTGRAY; public TileEntityOpenComputersCablePaintable() { node = Network.newNode(this, Visibility.None).create(); @@ -181,6 +230,8 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements this.block = id == 0 ? null : Block.getBlockById(id); this.meta = nbt.getInteger("meta"); + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); + if (node != null && node.host() == this) { node.load(nbt.getCompoundTag("oc:node")); } @@ -192,6 +243,8 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); nbt.setInteger("meta", meta); + nbt.setInteger("dyeColor", color.getColor()); + if (node != null && node.host() == this) { final NBTTagCompound nodeNbt = new NBTTagCompound(); node.save(nodeNbt); @@ -212,6 +265,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements if(nbt.hasKey("paintblock")) { this.block = Block.getBlockById(nbt.getInteger("paintblock")); this.meta = nbt.getInteger("paintmeta"); + this.color = OCColors.fromInt(nbt.getInteger("dyeColor")); } } @@ -221,6 +275,30 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements return node; } + public Node sidedNode(ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return null; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + if (neighbor instanceof Environment) + return node; + else + return null; + } + + Colored cable = (Colored) neighbor; + if (cable.getColor() == color.getColor()) + return node; + else + return null; + } + @Override public void onConnect(Node node) {} @@ -240,5 +318,31 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements super.invalidate(); if (node != null) node.remove(); } + + public boolean canConnect(net.minecraftforge.common.util.ForgeDirection side) { + if (side == ForgeDirection.UNKNOWN) + return false; + + int neighborX = super.xCoord + side.offsetX; + int neighborY = super.yCoord + side.offsetY; + int neighborZ = super.zCoord + side.offsetZ; + TileEntity neighbor = worldObj.getTileEntity(neighborX, neighborY, neighborZ); + + // If a cable does not support colors but is a valid cable block, allow it to connect regardless of color. + if (!(neighbor instanceof Colored)) { + return neighbor instanceof Environment; + } + + Colored cable = (Colored) neighbor; + return cable.getColor() == color.getColor(); + } + + public void setColor(int newColor) { + color = OCColors.fromInt(newColor); + } + + public int getColor() { + return color.getColor(); + } } } diff --git a/src/main/java/com/hbm/handler/CompatHandler.java b/src/main/java/com/hbm/handler/CompatHandler.java index 46ce74fc0..ac4bbe114 100644 --- a/src/main/java/com/hbm/handler/CompatHandler.java +++ b/src/main/java/com/hbm/handler/CompatHandler.java @@ -1,11 +1,13 @@ package com.hbm.handler; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.network.BlockOpenComputersCablePaintable; import com.hbm.inventory.RecipesCommon; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.util.ItemStackUtil; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Optional; import li.cil.oc.api.Items; @@ -15,6 +17,7 @@ import li.cil.oc.api.machine.Context; import li.cil.oc.api.network.*; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -108,27 +111,66 @@ public class CompatHandler { } } - /** - * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. - */ - public enum OCColors { - BLACK, //0x444444 - RED, //0xB3312C - GREEN, //0x339911 - BROWN, //0x51301A - BLUE, //0x6666FF - PURPLE, //0x7B2FBE - CYAN, //0x66FFFF - LIGHTGRAY, //0xABABAB - GRAY, //0x666666 - PINK, //0xD88198 - LIME, //0x66FF66 - YELLOW, //0xFFFF66 - LIGHTBLUE, //0xAAAAFF - MAGENTA, //0xC354CD - ORANGE, //0xEB8844 - WHITE //0xF0F0F0 - } + /** + * Simple enum for mapping OC color ordinals to a nicer format for adding new disks. + */ + public enum OCColors { + BLACK(0x444444, "dyeBlack"), + RED(0xB3312C, "dyeRed"), + GREEN(0x339911, "dyeGreen"), + BROWN(0x51301A, "dyeBrown"), + BLUE(0x6666FF, "dyeBlue"), + PURPLE(0x7B2FBE, "dyePurple"), + CYAN(0x66FFFF, "dyeCyan"), + LIGHTGRAY(0xABABAB, "dyeLightGray"), + GRAY(0x666666, "dyeGray"), + PINK(0xD88198, "dyePink"), + LIME(0x66FF66, "dyeLime"), + YELLOW(0xFFFF66, "dyeYellow"), + LIGHTBLUE(0xAAAAFF, "dyeLightBlue"), + MAGENTA(0xC354CD, "dyeMagenta"), + ORANGE(0xEB8844, "dyeOrange"), + WHITE(0xF0F0F0, "dyeWhite"), + NONE(0x0, ""); + + private final int color; + private final String dictName; + + OCColors(int color, String dictName) { + this.color = color; + this.dictName = dictName; + } + + public int getColor() { + return color; + } + + public static OCColors fromInt(int intColor) { + for (OCColors iColor : OCColors.values()) { + if (intColor == iColor.getColor()) + return iColor; + } + return OCColors.NONE; + } + + public static OCColors fromDye(ItemStack stack) { + List oreNames = ItemStackUtil.getOreDictNames(stack); + + for(String dict : oreNames) { + if(!(dict.length() > 3) || !dict.startsWith("dye")) + continue; + + for (OCColors color : OCColors.values()) { + if(!color.dictName.equals(dict)) + continue; + + return color; + } + } + + return OCColors.NONE; + } + } // Where all disks are stored with their name and `FloppyDisk` class. public static HashMap disks = new HashMap<>(); diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_base.png index 243c2da7f8f52b96ec7dba690200d6902ca3ea4d..7c9e1b0dd15b54f089e760fd3361342c81d78654 100644 GIT binary patch delta 587 zcmV-R0<`_`1mpyeB!4SOL_t(IPmPn$PZL2D$G=k+DQj)Cdg0)e#GnvMsUcv=Dq1mk zl0sX-#DBp*fP+_zH{!u7fq3#FXhm!Vg9a-ej8PK~#%R)@K)Wsd-5uvmvg?-Cgh@6t zdHddHzVF8{pU=lHUhtz>D&bcu1w~PCR8`@2xnOXPcBd20wtqHMDiyS}DB^RVR;%ID zm#;`|Z-Xs9Uf?G^9&iA^cXsgo$4_zMIORDZVR|-;Kf8NyA9JB*a8#>RobKola04^5 z55Z>d&v0)~w*+i#enc#uKv~?z#qCF06{zhhNA&-_}7;uOn0x=PAaM6DY&~vs6?~{Ps%S4FbwC2Bh=Klo zyhyyZ6f|wY0iy+&42QYjdtNHgv$;df0Tq$nhHT@VsVVO5K8KfUYe;8w2{5P7ywsdV z`*czl2t>k0uaEG_v72}_H!oi#Ihg^p(;}#OHg}o<={FPz@Lr)HvHsR_Gz08!zz(yQ Z<1fjbRIG!_>}LP~002ovPDHLkV1lxO4jupi delta 599 zcmV-d0;v7u1n>lqB!4$aL_t(IPmNPePg6k@JyTw#t(9P9L!!nNiBTbzrUt4-6pa{N zNufnBaZBRDf8ZXs#DyypB5|R(p?)A*!5|?O7cSHUjWL=u$Vb~(`rUV(JISlB+C*;h zGLw1to;l~-JHqGl(Ww)DD-OeCOb8g{!}XmYz@5W(qiz<<%$h*GJ9h6YW3HdHDV zeE9eYiM2I|nFmv}&*K3B__eWtZ{L5&9ihduSAnH<9qXH0XxigO#UPZ+WgKX2mEZ=( zC+?QMBx2ZTUApGP*Eg%}XW;v8-aT2oV_!(S(V^C)XVPk>X6;A2Gi$m zC=YrA0Yv9sVk?!Z0l0VLD_Wcy#-;*Fo*As48L$iy4u1_$Ur!J-vvV~7?DFHAU$CAl zV@bb-$%oVR0V1Ig_4l2X5}womc$%AWy1N^P4(?a8@hBRt0&r*e0>$8Jc!*B={g|Df zmo)!K_@A5H0R_M&2D`fOJodVV!Hxk&!eR1zk1GagJ+q@ZU=z7Js*Tr2N6FiM3@;WI zkW8f&fKWMwCJS>Kt<%X}U=VTXVn2-xT*2MR`|3qbLAOOc|E}(bxH=Y l#kbW&v%vZWtYB7uegh`$POLLim?QuI002ovPDHLkV1jWf8Vvvd diff --git a/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png b/src/main/resources/assets/hbm/textures/blocks/oc_cable_color.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3be6c7bb723b6a0d52cc6190ff27529f04a829 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr}70DGLM)f>z8=+#&Tr zo?}BRud={`?qpu(35+kgHg-1hNS|X15b0R5TV+J!Z|a0VjCfT@vZ7+!wnWN6x=%|Mm`bv{=a#Cg9nWG^=%&j5S6G7^>bP0l+XkK De2Z3~ From 76368acbf8aa770605a2f65e3b142baa70acf217 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Mon, 14 Jul 2025 20:52:12 -0500 Subject: [PATCH 41/45] remove unused imports in BlockOpenComputersCablePaintable.java --- .../hbm/blocks/network/BlockOpenComputersCablePaintable.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index 915fb58f0..c18f5ce2b 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,8 +2,6 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; -import com.hbm.blocks.ILookOverlay; -import com.hbm.handler.CompatHandler; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -15,9 +13,7 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -32,7 +28,6 @@ import li.cil.oc.api.network.Node; import li.cil.oc.api.Network; import li.cil.oc.api.network.Visibility; import cpw.mods.fml.common.Optional; -import cpw.mods.fml.common.Loader; import li.cil.oc.api.network.SidedEnvironment; import net.minecraftforge.common.util.ForgeDirection; import li.cil.oc.api.internal.Colored; From 5f8b0f6aedc1445b934a59ef5b73543f62584995 Mon Sep 17 00:00:00 2001 From: PewPewCricket Date: Tue, 15 Jul 2025 04:10:06 -0500 Subject: [PATCH 42/45] fix TileEntityOpenComputersCablePaintable not implementing ICopyable and add null check for ModBlocks.oc_cable_paintable in CraftingManager.java --- .../hbm/blocks/network/BlockOpenComputersCablePaintable.java | 3 ++- src/main/java/com/hbm/main/CraftingManager.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java index c18f5ce2b..d40d81595 100644 --- a/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockOpenComputersCablePaintable.java @@ -2,6 +2,7 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.TileEntityLoadedBase; @@ -176,7 +177,7 @@ public class BlockOpenComputersCablePaintable extends BlockContainer implements @Optional.Interface(iface = "li.cil.oc.api.network.SidedEnvironment", modid = "OpenComputers"), @Optional.Interface(iface = "li.cil.oc.api.network.Colored", modid = "OpenComputers") }) - public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored { + public static class TileEntityOpenComputersCablePaintable extends TileEntityLoadedBase implements Environment, SidedEnvironment, Colored, ICopiable { protected Node node; protected boolean addedToNetwork = false; diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d91f00033..89650f200 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -237,7 +237,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.machine_electric_furnace_off), 1), new Object[] { "BBB", "WFW", "RRR", 'B', BE.ingot(), 'R', ModItems.coil_tungsten, 'W', CU.plateCast(), 'F', Item.getItemFromBlock(Blocks.furnace) }); addRecipeAuto(new ItemStack(ModBlocks.red_wire_coated, 16), new Object[] { "WRW", "RIR", "WRW", 'W', ModItems.plate_polymer, 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.red_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', MINGRADE.ingot(), 'R', MINGRADE.wireFine() }); - addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); + if (ModBlocks.oc_cable_paintable != null) + addRecipeAuto(new ItemStack(ModBlocks.oc_cable_paintable, 16), new Object[] { "WRW", "RIR", "WRW", 'W', STEEL.plate(), 'I', REDSTONE.dust(), 'R', MINGRADE.wireFine() }); addRecipeAuto(new ItemStack(ModBlocks.cable_switch, 1), new Object[] { "S", "W", 'S', Blocks.lever, 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_detector, 1), new Object[] { "S", "W", 'S', REDSTONE.dust(), 'W', ModBlocks.red_wire_coated }); addRecipeAuto(new ItemStack(ModBlocks.cable_diode, 1), new Object[] { " Q ", "CAC", " Q ", 'Q', SI.nugget(), 'C', ModBlocks.red_cable, 'A', AL.ingot() }); From 281e66b37e3852d3ce466ebaea0347b889af1b87 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 15 Jul 2025 16:00:43 +0200 Subject: [PATCH 43/45] my love is a quickscope --- changelog | 1 + .../com/hbm/crafting/ConsumableRecipes.java | 2 - .../inventory/recipes/AssemblerRecipes.java | 21 -- .../recipes/AssemblyMachineRecipes.java | 181 +++++++++++++++++- src/main/java/com/hbm/items/ModItems.java | 8 +- .../java/com/hbm/items/food/ItemEnergy.java | 54 +----- .../weapon/sedna/factory/XFactoryTool.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 2 + 8 files changed, 187 insertions(+), 84 deletions(-) diff --git a/changelog b/changelog index 6be709682..6221f663e 100644 --- a/changelog +++ b/changelog @@ -18,6 +18,7 @@ * This should fix the issue where most armors are quite weak against swords * Electric attacks (i.e. tesla cannon) are now in the "energy damage" category * This means that armors that have energy resistance actually properly work against the tesla cannon +* Heavy components are being deprecated ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index 8d867f56e..6c3e6f3b3 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -89,8 +89,6 @@ public class ConsumableRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.bottle2_empty, 6), new Object[] { " G ", "G G", "G G", 'G', KEY_ANYPANE }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust() }); CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_korl_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, CU.dust(), ST.dust() }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bottle2_fritz_special, 1), new Object[] { ModItems.bottle2_empty, Items.potionitem, Items.sugar, W.dust(), TH232.dust() }); //Syringes CraftingManager.addRecipeAuto(new ItemStack(ModItems.syringe_empty, 6), new Object[] { "P", "C", "B", 'B', Item.getItemFromBlock(Blocks.iron_bars), 'C', ModItems.cell_empty, 'P', IRON.plate() }); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 13e823907..1960d4dfb 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -23,9 +23,7 @@ import com.hbm.config.GeneralConfig; import com.hbm.inventory.OreDictManager; import com.hbm.inventory.RecipesCommon.*; import com.hbm.inventory.fluid.Fluids; -import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; -import com.hbm.inventory.material.NTMMaterial; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.items.ItemEnums.EnumCasingType; @@ -842,19 +840,6 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemfac, 1), new AStack[] { - !exp ? new OreDictStack(STEEL.ingot(), 48) : new OreDictStack(STEEL.heavyComp(), 2), - new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), - new OreDictStack(NB.ingot(), 4), - new OreDictStack(RUBBER.ingot(), 16), - new OreDictStack(STEEL.shell(), 12), - new ComparableStack(ModItems.tank_steel, 8), - new ComparableStack(ModItems.motor_desh, 4), - new ComparableStack(ModItems.coil_tungsten, 24), - new OreDictStack(STEEL.pipe(), 8), - new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC) - }, 400); - makeRecipe(new ComparableStack(ModBlocks.machine_chemical_factory, 1), new AStack[] { new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), @@ -1310,12 +1295,6 @@ public class AssemblerRecipes extends SerializableRecipe { } } - for(NTMMaterial mat : Mats.orderedList) { - if(mat.autogen.contains(MaterialShapes.CASTPLATE) && mat.autogen.contains(MaterialShapes.HEAVY_COMPONENT)) { - makeRecipe(new ComparableStack(ModItems.heavy_component, 1, mat.id), new AStack[] { new OreDictStack(MaterialShapes.CASTPLATE.name() + mat.names[0], 256) }, 12_000); - } - } - // WarTec compatibility code try { Class wartecmodAssemblerRecipes = ClassLoader.getSystemClassLoader().loadClass("com.wartec.wartecmod.inventory.wartecmodAssemblerRecipes"); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 39f2fc198..aed9b4798 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -7,12 +7,17 @@ import java.util.List; import static com.hbm.inventory.OreDictManager.*; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockCap.EnumCapBlock; +import com.hbm.blocks.machine.BlockICFLaserComponent.EnumICFPart; +import com.hbm.config.GeneralConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.material.Mats; import com.hbm.inventory.recipes.loader.GenericRecipe; import com.hbm.inventory.recipes.loader.GenericRecipes; import com.hbm.items.ModItems; @@ -22,11 +27,14 @@ import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.machine.ItemFluidIcon; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.machine.ItemDrillbit.EnumDrillType; +import com.hbm.items.machine.ItemPACoil.EnumCoilType; import com.hbm.items.machine.ItemPistons.EnumPistonType; import com.hbm.items.weapon.ItemAmmoHIMARS; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import cpw.mods.fml.common.Loader; +import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -65,6 +73,14 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ALLOY.plate(), 2), new OreDictStack(OreDictManager.getReflector(), 1), new OreDictStack(BIGMT.plate(), 1))); this.register(new GenericRecipe("ass.dalekanium").setup(200, 100).outputItems(new ItemStack(ModItems.plate_dalekanium, 1)) .inputItems(new ComparableStack(ModBlocks.block_meteor, 1))); + this.register(new GenericRecipe("ass.platedesh").setup(200, 100).outputItems(new ItemStack(ModItems.plate_desh, 4)) + .inputItems(new OreDictStack(DESH.ingot(), 4), new OreDictStack(ANY_PLASTIC.dust(), 2), new OreDictStack(DURA.ingot(), 1))); + this.register(new GenericRecipe("ass.platebismuth").setup(200, 100).outputItems(new ItemStack(ModItems.plate_bismuth, 1)) + .inputItems(new ComparableStack(ModItems.nugget_bismuth, 2), new OreDictStack(U238.billet(), 2), new OreDictStack(NB.dust(), 1))); + this.register(new GenericRecipe("ass.plateeuphemium").setup(600, 100).outputItems(new ItemStack(ModItems.plate_euphemium, 1)) + .inputItems(new OreDictStack(EUPH.ingot(), 4), new OreDictStack(AT.dust(), 3), new OreDictStack(BI.dust(), 1), new OreDictStack(VOLCANIC.gem(), 1), new ComparableStack(ModItems.ingot_osmiridium))); + this.register(new GenericRecipe("ass.platednt").setup(600, 100).outputItems(new ItemStack(ModItems.plate_dineutronium, 4)) + .inputItems(new OreDictStack(DNT.ingot(), 4), new ComparableStack(ModItems.powder_spark_mix, 2), new OreDictStack(DESH.ingot(), 1))); // cloth this.register(new GenericRecipe("ass.hazcloth").setup(50, 100).outputItems(new ItemStack(ModItems.hazmat_cloth, 4)) @@ -124,7 +140,42 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(PB.plate(), 6), new OreDictStack(ALLOY.plate(), 6), new OreDictStack(ANY_RUBBER.ingot(), 2), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 1))); this.register(new GenericRecipe("ass.firedoor").setup(300, 100).outputItems(new ItemStack(ModBlocks.fire_door, 1)) .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(ALLOY.plate(), 8), new OreDictStack(DURA.bolt(), 8), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.seal").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.transition_seal, 1)) + .inputItems(new ComparableStack(ModBlocks.cmb_brick_reinforced, 16), new OreDictStack(STEEL.plate(), 64), new OreDictStack(ALLOY.plate(), 40), new OreDictStack(ANY_RUBBER.ingot(), 36), new OreDictStack(STEEL.block(), 24), new ComparableStack(ModItems.motor_desh, 16), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_YELLOW, 4))); + this.register(new GenericRecipe("ass.slidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_blast_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(W.ingot(), 8), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ANY_RUBBER.ingot(), 4), new OreDictStack(DURA.bolt(), 16), new ComparableStack(ModItems.motor, 2))); + this.register(new GenericRecipe("ass.vehicledoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.large_vehicle_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.waterdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.water_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 16), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_RED, 1))); + this.register(new GenericRecipe("ass.qedoor").setup(400, 100).outputItems(new ItemStack(ModBlocks.qe_containment, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(ALLOY.plate(), 4), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_BLACK, 4))); + this.register(new GenericRecipe("ass.queslidingdoor").setup(200, 100).outputItems(new ItemStack(ModBlocks.qe_sliding_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 4), new ComparableStack(Blocks.glass, 4))); + this.register(new GenericRecipe("ass.roundairlock").setup(400, 100).outputItems(new ItemStack(ModBlocks.round_airlock_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 8), new ComparableStack(ModItems.plate_polymer, 16), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.secureaccess").setup(400, 100).outputItems(new ItemStack(ModBlocks.secure_access_door, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ALLOY.plate(), 16), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 4), new OreDictStack(DURA.bolt(), 32), new OreDictStack(KEY_RED, 8))); + this.register(new GenericRecipe("ass.slidingseal").setup(200, 100).outputItems(new ItemStack(ModBlocks.sliding_seal_door, 1)) + .inputItems(new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(DURA.bolt(), 4), new OreDictStack(KEY_WHITE, 2))); + this.register(new GenericRecipe("ass.silohatch").setup(200, 100).outputItems(new ItemStack(ModBlocks.silo_hatch, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new ComparableStack(ModItems.plate_polymer, 4), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 4))); + this.register(new GenericRecipe("ass.silohatchlarge").setup(300, 100).outputItems(new ItemStack(ModBlocks.silo_hatch_large, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.motor, 2), new OreDictStack(STEEL.bolt(), 16), new OreDictStack(KEY_GREEN, 8))); + // decoration + this.register(new GenericRecipe("ass.capnuka").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.NUKA)) + .inputItems(new ComparableStack(ModItems.cap_nuka, 128))); + this.register(new GenericRecipe("ass.capquantum").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.QUANTUM)) + .inputItems(new ComparableStack(ModItems.cap_quantum, 128))); + this.register(new GenericRecipe("ass.capsparkle").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.SPARKLE)) + .inputItems(new ComparableStack(ModItems.cap_sparkle, 128))); + this.register(new GenericRecipe("ass.caprad").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.RAD)) + .inputItems(new ComparableStack(ModItems.cap_rad, 128))); + this.register(new GenericRecipe("ass.capfritz").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.FRITZ)) + .inputItems(new ComparableStack(ModItems.cap_fritz, 128))); + this.register(new GenericRecipe("ass.capkorl").setup(10, 100).outputItems(DictFrame.fromOne(ModBlocks.block_cap, EnumCapBlock.KORL)) + .inputItems(new ComparableStack(ModItems.cap_korl, 128))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModBlocks., 1)) .inputItems()); @@ -143,20 +194,48 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(ANY_CONCRETE.any(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16),new OreDictStack(STEEL.plateCast(), 8), new ComparableStack(ModBlocks.machine_transformer, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG.ordinal()))); this.register(new GenericRecipe("ass.acidizer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_crystallizer, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(TI.shell(), 3), new OreDictStack(DESH.ingot(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.electrolyzer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_electrolyser, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 16), new OreDictStack(TI.shell(), 3), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.ingot_firebrick, 16), new ComparableStack(ModItems.coil_copper, 16), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.rtg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_rtg_grey, 1)) .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(STEEL.plate528(), 4), new OreDictStack(MINGRADE.wireFine(), 16), new OreDictStack(ANY_PLASTIC.ingot(), 4))); this.register(new GenericRecipe("ass.derrick").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_well, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(CU.plateCast(), 2), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.drill_titanium, 1))); this.register(new GenericRecipe("ass.pumpjack").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_pumpjack, 1)) .inputItems(new OreDictStack(DURA.plate(), 8), new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh), new ComparableStack(ModItems.drill_titanium, 1))); + this.register(new GenericRecipe("ass.fracker").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_fracking_tower, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 24), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModBlocks.concrete_smooth, 64), new ComparableStack(ModItems.drill_titanium), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.plate_desh, 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR))); this.register(new GenericRecipe("ass.flarestack").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_flare, 1)) .inputItems(new OreDictStack(STEEL.plate(), 12), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 4), new ComparableStack(ModItems.thermo_element, 3))); this.register(new GenericRecipe("ass.refinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_refinery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 3), new OreDictStack(CU.plate528(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.plate_polymer, 8), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.crackingtower").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_cracker, 1)) + .inputItems(new ComparableStack(ModBlocks.steel_scaffold, 16), new OreDictStack(STEEL.shell(), 6), new OreDictStack(ANY_PLASTIC.ingot(), 4), new OreDictStack(NB.ingot(), 2), new ComparableStack(ModItems.catalyst_clay, 12))); + this.register(new GenericRecipe("ass.radiolysis").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_radiolysis, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(PB.plate528(), 12), new OreDictStack(CU.plateCast(), 4), new OreDictStack(RUBBER.ingot(), 8), new ComparableStack(ModItems.thermo_element, 8))); this.register(new GenericRecipe("ass.coker").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_coker, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 8), new OreDictStack(RUBBER.ingot(), 4), new OreDictStack(NB.ingot(), 4))); + this.register(new GenericRecipe("ass.vaccumrefinery").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_vacuum_distill, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate528(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(STEEL.pipe(), 12), new ComparableStack(ModItems.motor_desh, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.CHIP_BISMOID))); + this.register(new GenericRecipe("ass.reformer").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_catalytic_reformer, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(CU.plate528(), 8), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 3), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.hydrotreater").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hydrotreater, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(CU.plateCast(), 4), new OreDictStack(NB.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.shell(), 2), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.pyrooven").setup(300, 100).outputItems(new ItemStack(ModBlocks.machine_pyrooven, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.ingot_cft, 4), new OreDictStack(CU.pipe(), 12), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.liquefactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_liquefactor, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(CU.plate528(), 12), new OreDictStack(ANY_TAR.any(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_tungsten, 8))); + this.register(new GenericRecipe("ass.solidifier").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_solidifier, 1)) + .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(AL.plate528(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 4), new ComparableStack(ModItems.circuit, 12, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.coil_copper, 4))); + this.register(new GenericRecipe("ass.compressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate528(), 4), new OreDictStack(STEEL.shell(), 2), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); + this.register(new GenericRecipe("ass.compactcompressor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_compressor_compact, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(TI.shell(), 4), new OreDictStack(CU.pipe(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.epress").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_epress, 1)) .inputItems(new OreDictStack(STEEL.plate(), 8), new OreDictStack(ANY_RUBBER.ingot(), 4), new ComparableStack(ModItems.part_generic, 2, EnumPartType.PISTON_HYDRAULIC.ordinal()), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.fel").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_fel, 1)) + .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(ALLOY.wireDense(), 64), new OreDictStack(STEEL.plateCast(), 12), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.silex").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_silex, 1)) + .inputItems(new ComparableStack(ModBlocks.glass_quartz, 16), new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(DESH.ingot(), 4), new OreDictStack(RUBBER.ingot(), 8), new OreDictStack(STEEL.pipe(), 8))); this.register(new GenericRecipe("ass.excavator").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_excavator, 1)) .inputItems(new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(STEEL.ingot(), 8), new OreDictStack(IRON.ingot(), 8), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ANALOG))); this.register(new GenericRecipe("ass.drillsteel").setup(100, 100).outputItems(new ItemStack(ModItems.drillbit, 1, EnumDrillType.STEEL.ordinal())) @@ -191,9 +270,15 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(STEEL.plateWelded(), 6), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_RUBBER.ingot(), 24), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.motor_desh, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.crt_display, 4))); this.register(new GenericRecipe("ass.forcefield").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_forcefield, 1)) .inputItems(new OreDictStack(ALLOY.plate528(), 8), new ComparableStack(ModItems.plate_desh, 4), new ComparableStack(ModItems.coil_gold_torus, 6), new ComparableStack(ModItems.coil_magnetized_tungsten, 12), new ComparableStack(ModItems.motor, 1), new ComparableStack(ModItems.upgrade_radius, 1), new ComparableStack(ModItems.upgrade_health, 1), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED), new ComparableStack(ModBlocks.machine_transformer, 1))); + this.register(new GenericRecipe("ass.difurnacertg").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_difurnace_rtg_off, 1)) + .inputItems(new ComparableStack(ModItems.rtg_unit, 3), new OreDictStack(DESH.ingot(), 4), new OreDictStack(PB.plate528(), 6), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(CU.plate(), 12))); this.register(new GenericRecipe("ass.strandcaster").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_strand_caster, 1)) .inputItems(new ComparableStack(ModItems.ingot_firebrick, 16), new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(STEEL.shell(), 2), new OreDictStack(ANY_CONCRETE.any(), 8))); - + this.register(new GenericRecipe("ass.assemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_assemfac, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 48), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(B.ingot(), 4), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(KEY_ANYPANE, 64), new ComparableStack(ModItems.motor, 18), new OreDictStack(W.bolt(), 16), new OreDictStack(STEEL.pipe(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.chemfac").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_chemical_factory, 1)) + .inputItems(new OreDictStack(DURA.ingot(), 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(STEEL.shell(), 12), new OreDictStack(CU.pipe(), 8), new ComparableStack(ModItems.motor_desh, 4), new ComparableStack(ModItems.coil_tungsten, 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + // generators this.register(new GenericRecipe("ass.dieselgen").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_diesel, 1)) .inputItems(new OreDictStack(STEEL.shell(), 1), new OreDictStack(CU.plateCast(), 2), new ComparableStack(ModItems.coil_copper, 4))); @@ -211,11 +296,15 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new OreDictStack(TI.shell(), 8), new OreDictStack(DURA.pipe(), 4), new OreDictStack(ANY_PLASTIC.ingot(), 12), new ComparableStack(ModItems.turbine_tungsten, 1), new OreDictStack(GOLD.wireDense(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); this.register(new GenericRecipe("ass.gasturbine").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_turbinegas, 1)) .inputItems(new OreDictStack(STEEL.shell(), 10), new OreDictStack(GOLD.wireDense(), 12), new OreDictStack(DURA.pipe(), 4),new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.turbine_tungsten, 1), new ComparableStack(ModItems.ingot_rubber, 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC.ordinal()))); + this.register(new GenericRecipe("ass.hephaestus").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_hephaestus, 1)) + .inputItems(new OreDictStack(STEEL.pipe(), 12), new OreDictStack(STEEL.ingot(), 24), new OreDictStack(CU.plate(), 24), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16))); this.register(new GenericRecipe("ass.iturbine").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_large_turbine, 1)) .inputItems(new OreDictStack(STEEL.plate528(), 12), new OreDictStack(RUBBER.ingot(), 4), new ComparableStack(ModItems.turbine_titanium, 3), new OreDictStack(GOLD.wireDense(), 6), new OreDictStack(DURA.pipe(), 3), new OreDictStack(STEEL.pipe(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.leviturbine").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_chungus, 1)) .inputItems(new OreDictStack(STEEL.shell(), 6), new OreDictStack(STEEL.plateWelded(), 16), new OreDictStack(TI.plate528(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 16), new ComparableStack(ModItems.turbine_tungsten, 5), new ComparableStack(ModItems.turbine_titanium, 3), new ComparableStack(ModItems.flywheel_beryllium, 1), new OreDictStack(GOLD.wireDense(), 48), new OreDictStack(DURA.pipe(), 16), new OreDictStack(STEEL.pipe(), 16))); - + this.register(new GenericRecipe("ass.radgen").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_radgen, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "radgen") + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new OreDictStack(MAGTUNG.wireFine(), 24), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1))); + // condensers this.register(new GenericRecipe("ass.hpcondenser").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_condenser_powered, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 4), new OreDictStack(CU.plate528(), 16), new ComparableStack(ModItems.motor_desh, 3), new OreDictStack(STEEL.pipe(), 24), new OreDictStack(Fluids.LUBRICANT.getDict(1_000), 4))); @@ -223,11 +312,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { // batteries this.register(new GenericRecipe("ass.battery").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) .inputItems(new OreDictStack(STEEL.plateWelded(), 1), new OreDictStack(S.dust(), 12), new OreDictStack(PB.dust(), 12))); - this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batterylithium").setup(100, 100).outputItems(new ItemStack(ModBlocks.machine_lithium_battery, 1)) .inputItems(new OreDictStack(ANY_PLASTIC.ingot(), 8), new OreDictStack(CO.dust(), 12), new OreDictStack(LI.dust(), 12))); - this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batteryschrabidium").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_schrabidium_battery, 1)) .inputItems(new OreDictStack(DESH.ingot(), 16), new OreDictStack(NP237.dust(), 12), new OreDictStack(SA326.dust(), 12))); - this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_battery, 1)) + this.register(new GenericRecipe("ass.batterydnt").setup(400, 100).outputItems(new ItemStack(ModBlocks.machine_dineutronium_battery, 1)) .inputItems(new OreDictStack(DNT.ingot(), 24), new ComparableStack(ModItems.powder_spark_mix, 12), new ComparableStack(ModItems.battery_spark_cell_1000, 1), new OreDictStack(CMB.ingot(), 32))); this.register(new GenericRecipe("ass.fensusan").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.machine_fensu, 1)) .inputItems(new ComparableStack(ModItems.ingot_electronium, 32), @@ -253,11 +342,34 @@ public class AssemblyMachineRecipes extends GenericRecipes { // accelerators this.register(new GenericRecipe("ass.cyclotron").setup(600, 100).outputItems(new ItemStack(ModBlocks.machine_cyclotron, 1)) .inputItems(new ComparableStack(ModBlocks.machine_lithium_battery, 3), new OreDictStack(ND.wireDense(), 32), new OreDictStack(STEEL.ingot(), 16), new OreDictStack(STEEL.plate528(), 32), new OreDictStack(AL.plate528(), 32), new OreDictStack(ANY_PLASTIC.ingot(), 24), new OreDictStack(RUBBER.ingot(), 24), new OreDictStack(CU.plateCast(), 8), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BASIC))); + this.register(new GenericRecipe("ass.beamline").setup(200, 100).outputItems(new ItemStack(ModBlocks.pa_beamline, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 8), new OreDictStack(CU.plate(), 16), new OreDictStack(GOLD.wireDense(), 4))); + this.register(new GenericRecipe("ass.rfc").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_rfc, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(CU.plate(), 64), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16))); + this.register(new GenericRecipe("ass.quadrupole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_quadrupole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 1), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.dipole").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_dipole, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 2), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 32), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.source").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_source, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.magnetron, 16), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.detector").setup(400, 100).outputItems(new ItemStack(ModBlocks.pa_detector, 1)) + .inputItems(new ComparableStack(ModBlocks.pa_beamline, 3), new OreDictStack(STEEL.plateCast(), 24), new OreDictStack(GOLD.wireDense(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.pagold").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.GOLD.ordinal())).inputItems(new OreDictStack(GOLD.wireDense(), 128))); + this.register(new GenericRecipe("ass.panbti").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.NIOBIUM.ordinal())).inputItems(new OreDictStack(NB.wireDense(), 64), new OreDictStack(TI.wireDense(), 64))); + this.register(new GenericRecipe("ass.pabscco").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.BSCCO.ordinal())).inputItems(new OreDictStack(BSCCO.wireDense(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64))); + this.register(new GenericRecipe("ass.pachlorophyte").setup(400, 100).outputItems(new ItemStack(ModItems.pa_coil, 1, EnumCoilType.CHLOROPHYTE.ordinal())).inputItems(new OreDictStack(CU.wireDense(), 128), new ComparableStack(ModItems.powder_chlorophyte, 16))); + this.register(new GenericRecipe("ass.exposurechamber").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_exposure_chamber, 1)) + .inputItems(new OreDictStack(AL.plateCast(), 12), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 12), new OreDictStack(ALLOY.wireDense(), 32), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BISMOID), new ComparableStack(ModBlocks.capacitor_tantalium, 1), new ComparableStack(ModBlocks.glass_quartz, 16))); // reactors + this.register(new GenericRecipe("ass.breedingreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_reactor_breeding, 1)) + .inputItems(new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1))); + this.register(new GenericRecipe("ass.researchreactor").setup(200, 100).outputItems(new ItemStack(ModBlocks.reactor_research, 1)) + .inputItems(new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); this.register(new GenericRecipe("ass.cirnox").setup(600, 100).outputItems(new ItemStack(ModBlocks.reactor_zirnox, 1)) .inputItems(new OreDictStack(STEEL.shell(), 4), new OreDictStack(STEEL.pipe(), 8), new OreDictStack(B.ingot(), 8), new OreDictStack(GRAPHITE.ingot(), 16), new OreDictStack(RUBBER.ingot(), 16), new OreDictStack(ANY_CONCRETE.any(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.BASIC))); - + this.register(new GenericRecipe("ass.rbmk").setup(100, 100).outputItems(new ItemStack(ModBlocks.rbmk_blank, 1)) + .inputItems(new ComparableStack(ModBlocks.concrete_asbestos, 4), new OreDictStack(STEEL.plateCast(), 4), new OreDictStack(CU.plate(), 8), new ComparableStack(ModItems.plate_polymer, 4))); // fusion reactor this.register(new GenericRecipe("ass.fusioncore").setup(600, 100).outputItems(new ItemStack(ModBlocks.struct_iter_core, 1)) @@ -285,6 +397,33 @@ public class AssemblyMachineRecipes extends GenericRecipes { this.register(new GenericRecipe("ass.watzcasing").setup(100, 100).outputItems(new ItemStack(ModBlocks.watz_end, 3)) .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded()), new OreDictStack(B.ingot(), 3), new OreDictStack(STEEL.plateWelded(), 2))); + // ICF + this.register(new GenericRecipe("ass.icfcell").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CELL.ordinal())) + .inputItems(new ComparableStack(ModItems.ingot_cft, 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new ComparableStack(ModBlocks.glass_quartz, 16))); + this.register(new GenericRecipe("ass.icfemitter").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.EMITTER.ordinal())) + .inputItems(new OreDictStack(W.plateWelded(), 4), new OreDictStack(MAGTUNG.wireDense(), 16)) + .inputFluids(new FluidStack(Fluids.XENON, 16_000))); + this.register(new GenericRecipe("ass.icfcapacitor").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CAPACITOR.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 1), new OreDictStack(ND.wireDense(), 16), new OreDictStack(SBD.ingot(), 2))); + this.register(new GenericRecipe("ass.icfturbo").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.TURBO.ordinal())) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 2), new OreDictStack(DNT.wireDense(), 4), new OreDictStack(SBD.ingot(), 4))); + this.register(new GenericRecipe("ass.icfcasing").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.CASING.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(BIGMT.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16))); + this.register(new GenericRecipe("ass.icfport").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_laser_component, 1, EnumICFPart.PORT.ordinal())) + .inputItems(new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 2), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ND.wireDense(), 4))); + this.register(new GenericRecipe("ass.icfcontroller").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_controller, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 4), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID))); + this.register(new GenericRecipe("ass.icfscaffold").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 0)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 4), new OreDictStack(TI.plateWelded(), 2))); + this.register(new GenericRecipe("ass.icfvessel").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 1)) + .inputItems(new ComparableStack(ModItems.ingot_cft, 1), new OreDictStack(CMB.plateCast(), 1), new OreDictStack(W.plateWelded(), 2))); + this.register(new GenericRecipe("ass.icfstructural").setup(200, 100).outputItems(new ItemStack(ModBlocks.icf_component, 1, 3)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 2), new OreDictStack(CU.plateWelded(), 2), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 1))); + this.register(new GenericRecipe("ass.icfcore").setup(1_200, 100).outputItems(new ItemStack(ModBlocks.struct_icf_core, 1)) + .inputItems(new OreDictStack(CMB.plateWelded(), 16), new OreDictStack(ANY_RESISTANTALLOY.plateWelded(), 16), new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 16), new OreDictStack(SBD.wireDense(), 32), new ComparableStack(ModItems.circuit, 32, EnumCircuitType.BISMOID), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.QUANTUM))); + this.register(new GenericRecipe("ass.icfpress").setup(200, 100).outputItems(new ItemStack(ModBlocks.machine_icf_press, 1)) + .inputItems(new OreDictStack(GOLD.plateCast(), 8), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BISMOID))); + // upgrades this.register(new GenericRecipe("ass.overdrive1").setup(200, 100).outputItems(new ItemStack(ModItems.upgrade_overdrive_1, 1)) .inputItems(new ComparableStack(ModItems.upgrade_speed_3, 1), new ComparableStack(ModItems.upgrade_effect_3, 1), new OreDictStack(BIGMT.ingot(), 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.ADVANCED))); @@ -492,11 +631,16 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputFluids(new FluidStack(Fluids.DEUTERIUM, 4_000))); this.register(new GenericRecipe("ass.warheadvolcano").setup(600, 100).outputItems(new ItemStack(ModItems.warhead_volcano, 1)) .inputItems(new OreDictStack(TI.plateCast(), 12), new OreDictStack(STEEL.plateCast(), 6), new ComparableStack(ModBlocks.det_nuke, 3), new OreDictStack(U238.block(), 24), new ComparableStack(ModItems.circuit, 5, EnumCircuitType.CAPACITOR_BOARD.ordinal()))); - this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) - .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); this.register(new GenericRecipe("ass.thrusternerva").setup(600, 100).outputItems(new ItemStack(ModItems.thruster_nuclear, 1)) .inputItems(new OreDictStack(DURA.ingot(), 32), new OreDictStack(B.ingot(), 8), new OreDictStack(PB.plate(), 16), new OreDictStack(STEEL.pipe(), 4))); - + this.register(new GenericRecipe("ass.stealthmissile").setup(1_200, 100).outputItems(new ItemStack(ModItems.missile_stealth, 1)) + .inputItems(new OreDictStack(TI.plate(), 20), new OreDictStack(AL.plate(), 20), new OreDictStack(KEY_BLACK, 16), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED.ordinal()), new OreDictStack(STEEL.bolt(), 32))); + this.register(new GenericRecipe("ass.shuttlemissile").setup(200, 100).outputItems(new ItemStack(ModItems.missile_shuttle, 1)) + .inputItems(new ComparableStack(ModItems.missile_generic, 2), new ComparableStack(ModItems.missile_strong, 1), new OreDictStack(KEY_ORANGE, 5), new ComparableStack(ModItems.canister_full, 24, Fluids.GASOLINE_LEADED.getID()), new OreDictStack(FIBER.ingot(), 12), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.BASIC), new OreDictStack(ANY_PLASTICEXPLOSIVE.ingot(), 8), new OreDictStack(KEY_ANYPANE, 6), new OreDictStack(STEEL.plate(), 4))); + this.register(new GenericRecipe("ass.launchpad").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad_large, 1)) + .inputItems(new OreDictStack(STEEL.plateCast(), 6), new OreDictStack(ANY_CONCRETE.any(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 16), new ComparableStack(ModBlocks.steel_scaffold, 24), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED))); + this.register(new GenericRecipe("ass.launchpadsilo").setup(200, 100).outputItems(new ItemStack(ModBlocks.launch_pad, 1)) + .inputItems(new OreDictStack(STEEL.plateWelded(), 8), new OreDictStack(ANY_CONCRETE.any(), 8), new OreDictStack(ANY_HARDPLASTIC.ingot(), 16), new ComparableStack(ModItems.circuit, 4, EnumCircuitType.ADVANCED))); /* this.register(new GenericRecipe("ass.").setup(, 100).outputItems(new ItemStack(ModItems., 1)) .inputItems()); @@ -526,6 +670,10 @@ public class AssemblyMachineRecipes extends GenericRecipes { .inputItems(new ComparableStack(ModItems.casing, 2, EnumCasingType.LARGE_STEEL), new OreDictStack(ANY_SMOKELESS.dust(), 24), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.black_diamond)) .setPools(GenericRecipes.POOL_PREFIX_SECRET + "psalm")); + // tools + this.register(new GenericRecipe("ass.multitool").setup(100, 100).outputItems(new ItemStack(ModItems.multitool_hit, 1)) + .inputItems(new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new OreDictStack(STEEL.plate(), 4), new OreDictStack(GOLD.wireFine(), 12), new ComparableStack(ModItems.motor, 4), new ComparableStack(ModItems.circuit, 16, EnumCircuitType.CAPACITOR_BOARD))); + // space this.register(new GenericRecipe("ass.soyuz").setup(6_000, 100).outputItems(new ItemStack(ModItems.missile_soyuz, 1)) .inputItems(new OreDictStack(TI.shell(), 32), @@ -626,6 +774,21 @@ public class AssemblyMachineRecipes extends GenericRecipes { new ComparableStack(ModItems.circuit, 64, EnumCircuitType.CONTROLLER_QUANTUM), new ComparableStack(ModItems.coin_ufo, 1)).setPools(GenericRecipes.POOL_PREFIX_DISCOVER + "gerald")); + if(GeneralConfig.enableMekanismChanges && Loader.isModLoaded("Mekanism")) { + Block mb = (Block) Block.blockRegistry.getObject("Mekanism:MachineBlock"); + if(mb != null) { + + this.register(new GenericRecipe("ass.digimemer").setup(1_200, 100).outputItems(new ItemStack(mb, 1, 4)) + .inputItems(new OreDictStack(BIGMT.plateCast(), 16), + new OreDictStack(CU.plateWelded(), 12), + new OreDictStack("alloyUltimate", 32), + new ComparableStack(ModItems.circuit, 16, EnumCircuitType.BISMOID), + new ComparableStack(ModItems.circuit, 32, EnumCircuitType.CAPACITOR_BOARD), + new ComparableStack(ModItems.wire_dense, 32, Mats.MAT_GOLD.id), + new ComparableStack(ModItems.motor_bismuth, 3))); + } + } + } public static HashMap getRecipes() { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index f6afda0e0..3ded60786 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -914,8 +914,6 @@ public class ModItems { public static Item bottle2_empty; public static Item bottle2_korl; public static Item bottle2_fritz; - public static Item bottle2_korl_special; - public static Item bottle2_fritz_special; public static Item flask_empty; public static Item flask_infusion; public static Item chocolate_milk; @@ -2925,7 +2923,7 @@ public class ModItems { ingot_raw = new ItemAutogen(MaterialShapes.INGOT).setUnlocalizedName("ingot_raw").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_raw"); plate_cast = new ItemAutogen(MaterialShapes.CASTPLATE).aot(Mats.MAT_BISMUTH, "plate_cast_bismuth").setUnlocalizedName("plate_cast").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_cast"); plate_welded = new ItemAutogen(MaterialShapes.WELDEDPLATE).setUnlocalizedName("plate_welded").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_welded"); - heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":heavy_component"); + heavy_component = new ItemAutogen(MaterialShapes.HEAVY_COMPONENT).setUnlocalizedName("heavy_component").setCreativeTab(null).setTextureName(RefStrings.MODID + ":heavy_component"); wire_fine = new ItemAutogen(MaterialShapes.WIRE) .aot(Mats.MAT_ALUMINIUM, "wire_aluminium").aot(Mats.MAT_COPPER, "wire_copper") .aot(Mats.MAT_MINGRADE, "wire_red_copper").aot(Mats.MAT_GOLD, "wire_gold") @@ -3093,8 +3091,6 @@ public class ModItems { bottle2_empty = new Item().setUnlocalizedName("bottle2_empty").setTextureName(RefStrings.MODID + ":bottle2_empty"); bottle2_korl = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); bottle2_fritz = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); - bottle2_korl_special = new ItemEnergy().makeBottle(bottle2_empty, cap_korl).setUnlocalizedName("bottle2_korl_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_korl"); - bottle2_fritz_special = new ItemEnergy().makeBottle(bottle2_empty, cap_fritz).setUnlocalizedName("bottle2_fritz_special").setContainerItem(ModItems.bottle2_empty).setTextureName(RefStrings.MODID + ":bottle2_fritz"); flask_infusion = new ItemFlask().setUnlocalizedName("flask_infusion").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":flask"); chocolate_milk = new ItemEnergy().setUnlocalizedName("chocolate_milk").setTextureName(RefStrings.MODID + ":chocolate_milk"); coffee = new ItemEnergy().setUnlocalizedName("coffee").setTextureName(RefStrings.MODID + ":coffee"); @@ -6705,8 +6701,6 @@ public class ModItems { GameRegistry.registerItem(bottle2_empty, bottle2_empty.getUnlocalizedName()); GameRegistry.registerItem(bottle2_korl, bottle2_korl.getUnlocalizedName()); GameRegistry.registerItem(bottle2_fritz, bottle2_fritz.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_korl_special, bottle2_korl_special.getUnlocalizedName()); - GameRegistry.registerItem(bottle2_fritz_special, bottle2_fritz_special.getUnlocalizedName()); GameRegistry.registerItem(bottle_opener, bottle_opener.getUnlocalizedName()); //Flasks diff --git a/src/main/java/com/hbm/items/food/ItemEnergy.java b/src/main/java/com/hbm/items/food/ItemEnergy.java index b01195ad9..caa47fc5c 100644 --- a/src/main/java/com/hbm/items/food/ItemEnergy.java +++ b/src/main/java/com/hbm/items/food/ItemEnergy.java @@ -23,6 +23,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import net.minecraftforge.common.util.FakePlayer; +@Spaghetti("wtf is this shit") public class ItemEnergy extends Item { private Item container = null; @@ -142,18 +143,6 @@ public class ItemEnergy extends Item { player.addPotionEffect(new PotionEffect(Potion.resistance.id, 30 * 20, 2)); player.addPotionEffect(new PotionEffect(Potion.jump.id, 30 * 20, 2)); } - if(this == ModItems.bottle2_korl_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 120 * 20, 2)); - } - if(this == ModItems.bottle2_fritz_special) { - player.heal(16); - player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); - player.addPotionEffect(new PotionEffect(Potion.resistance.id, 120 * 20, 2)); - player.addPotionEffect(new PotionEffect(Potion.jump.id, 120 * 20, 2)); - } if(this == ModItems.bottle_sparkle) { player.heal(10F); player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 120 * 20, 1)); @@ -202,28 +191,24 @@ public class ItemEnergy extends Item { } @Override - public int getMaxItemUseDuration(ItemStack p_77626_1_) { + public int getMaxItemUseDuration(ItemStack stack) { return 32; } @Override - public EnumAction getItemUseAction(ItemStack p_77661_1_) { + public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.drink; } @Spaghetti("cover yourself in oil") @Override - public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) { + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(VersatileConfig.hasPotionSickness(player)) return stack; + if(this.requiresOpener && !player.inventory.hasItem(ModItems.bottle_opener)) return stack; - if(VersatileConfig.hasPotionSickness(p_77659_3_)) - return p_77659_1_; - - if(this.requiresOpener && !p_77659_3_.inventory.hasItem(ModItems.bottle_opener)) - return p_77659_1_; + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); - p_77659_3_.setItemInUse(p_77659_1_, this.getMaxItemUseDuration(p_77659_1_)); - - return p_77659_1_; + return stack; } @Override @@ -260,51 +245,32 @@ public class ItemEnergy extends Item { } if(this == ModItems.bottle_nuka) { list.add("Contains about 210 kcal and 1500 mSv."); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_cherry) { list.add("Now with severe radiation poisoning in every seventh bottle!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_quantum) { list.add("Comes with a colorful mix of over 70 isotopes!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_korl) { list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle2_fritz) { list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_korl_special) { - if(MainRegistry.polaroidID == 11) - list.add("shgehgev u rguer"); - else - list.add("Contains actual orange juice!"); - list.add("[Requires bottle opener]"); - } - if(this == ModItems.bottle2_fritz_special) { - if(MainRegistry.polaroidID == 11) - list.add("ygrogr fgrof bf"); - else - list.add("moremore caffeine"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_sparkle) { if(MainRegistry.polaroidID == 11) list.add("Contains trace amounts of taint."); else list.add("The most delicious beverage in the wasteland!"); - list.add("[Requires bottle opener]"); } if(this == ModItems.bottle_rad) { if(MainRegistry.polaroidID == 11) list.add("Now with 400% more radiation!"); else list.add("Tastes like radish and radiation."); - list.add("[Requires bottle opener]"); } + + if(this.requiresOpener) list.add("[Requires bottle opener]"); } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java index 91cb0f688..6800ea13f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryTool.java @@ -242,7 +242,7 @@ public class XFactoryTool { .setOnUpdate(LAMBDA_FOAM_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_FOAM_HIT); - fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 1)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) + fext_sand = new BulletConfig().setItem(new ItemStack(ModItems.ammo_fireext, 1, 2)).setReloadCount(300).setLife(100).setVel(0.75F).setGrav(0.04D).setSpread(0.05F) .setOnUpdate(LAMBDA_SAND_UPDATE) .setOnEntityHit((bulletEntity, target) -> { if(target.entityHit != null) target.entityHit.extinguish(); }) .setOnRicochet(LAMBDA_SAND_HIT); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 756760d15..8588f66c2 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1716,6 +1716,8 @@ public class MainRegistry { ignoreMappings.add("hbm:item.chopper_blades"); ignoreMappings.add("hbm:item.component_emitter"); ignoreMappings.add("hbm:item.component_limiter"); + ignoreMappings.add("hbm:item.bottle2_korl_special"); + ignoreMappings.add("hbm:item.bottle2_fritz_special"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); From f94fd70cf0e8b93d0443edb912b3040f4707e0c2 Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 15 Jul 2025 21:42:05 +0200 Subject: [PATCH 44/45] falling in love with a corporate illustration --- changelog | 3 +- .../inventory/gui/GUIMachineTurbineGas.java | 4 +- .../recipes/AssemblyMachineRecipes.java | 2 +- .../tileentity/RenderSkeletonHolder.java | 8 +-- src/main/resources/assets/hbm/lang/de_DE.lang | 4 +- src/main/resources/assets/hbm/lang/en_US.lang | 4 +- .../hbm/models/machines/assembly_machine.obj | 64 +++++++++--------- .../blocks/pneumatic_tube_connector.png | Bin 322 -> 354 bytes .../hbm/textures/blocks/pneumatic_tube_in.png | Bin 415 -> 425 bytes .../textures/blocks/pneumatic_tube_out.png | Bin 429 -> 439 bytes .../hbm/textures/items/canister_biofuel.png | Bin 448 -> 0 bytes .../hbm/textures/items/canister_bitumen.png | Bin 478 -> 0 bytes .../hbm/textures/items/canister_blank.png | Bin 464 -> 221 bytes .../hbm/textures/items/canister_canola.png | Bin 426 -> 0 bytes .../hbm/textures/items/canister_empty.png | Bin 457 -> 398 bytes .../hbm/textures/items/canister_ethanol.png | Bin 563 -> 0 bytes .../hbm/textures/items/canister_fracksol.png | Bin 491 -> 0 bytes .../hbm/textures/items/canister_fuel.png | Bin 415 -> 0 bytes .../hbm/textures/items/canister_gasoline.png | Bin 451 -> 0 bytes .../textures/items/canister_heatingoil.png | Bin 454 -> 0 bytes .../hbm/textures/items/canister_heavyoil.png | Bin 435 -> 0 bytes .../hbm/textures/items/canister_kerosene.png | Bin 472 -> 0 bytes .../hbm/textures/items/canister_lightoil.png | Bin 473 -> 0 bytes .../hbm/textures/items/canister_napalm.png | Bin 515 -> 385 bytes .../hbm/textures/items/canister_naphtha.png | Bin 460 -> 0 bytes .../hbm/textures/items/canister_oil.png | Bin 431 -> 0 bytes .../hbm/textures/items/canister_overlay.png | Bin 424 -> 354 bytes .../hbm/textures/items/canister_petroil.png | Bin 444 -> 0 bytes .../hbm/textures/items/canister_reoil.png | Bin 450 -> 0 bytes .../hbm/textures/items/canister_smear.png | Bin 453 -> 0 bytes .../hbm/textures/items/canister_superfuel.png | Bin 454 -> 0 bytes .../hbm/textures/items/fluid_barrel.png | Bin 237 -> 305 bytes .../textures/items/fluid_barrel_infinite.png | Bin 289 -> 421 bytes .../textures/items/fluid_barrel_overlay.png | Bin 156 -> 208 bytes .../assets/hbm/textures/items/fluid_tank.png | Bin 172 -> 337 bytes .../hbm/textures/items/fluid_tank_overlay.png | Bin 143 -> 181 bytes .../assets/hbm/textures/items/gas_bottle.png | Bin 201 -> 211 bytes .../assets/hbm/textures/items/gas_empty.png | Bin 262 -> 252 bytes .../assets/hbm/textures/items/gas_label.png | Bin 118 -> 142 bytes .../assets/hbm/textures/items/inf_water.png | Bin 288 -> 432 bytes .../hbm/textures/items/inf_water_mk2.png | Bin 431 -> 436 bytes 41 files changed, 47 insertions(+), 42 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_biofuel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_bitumen.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_canola.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_ethanol.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_fracksol.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_fuel.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_gasoline.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_heatingoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_heavyoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_kerosene.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_lightoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_naphtha.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_oil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_petroil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_reoil.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_smear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/canister_superfuel.png diff --git a/changelog b/changelog index 6221f663e..00743753b 100644 --- a/changelog +++ b/changelog @@ -23,4 +23,5 @@ ## Fixed * Fixed gas centrifuge sound persisting when broken or when unloaded * Fixed all centrifuge sounds trying to play even when the player is far away, using up audio slots -* Fixed guns that don't have durability always displaying a condition of 0% \ No newline at end of file +* Fixed guns that don't have durability always displaying a condition of 0% +* Fixed GL state leak caused by skeletons \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java index 87895df93..66a3b7152 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineTurbineGas.java @@ -124,9 +124,9 @@ public class GUIMachineTurbineGas extends GuiInfoContainer { } if(turbinegas.temp >= 20) - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: " + (turbinegas.temp) + "°C"}); else - this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 133, guiTop + 23, 8, 72, mouseX, mouseY, new String[] {"Temperature: 20°C"}); turbinegas.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 16, 16, 48); turbinegas.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 70, 16, 32); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index aed9b4798..c6e98b525 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -48,7 +48,7 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public int outputItemLimit() { return 1; } @Override public int outputFluidLimit() { return 1; } - @Override public String getFileName() { return "hbmAsemblyMachine.json"; } + @Override public String getFileName() { return "hbmAssemblyMachine.json"; } @Override public GenericRecipe instantiateRecipe(String name) { return new GenericRecipe(name); } @Override diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java index adcbea5e9..45401d406 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -23,6 +23,10 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.enableStandardItemLighting(); + switch(te.getBlockMetadata()) { case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; @@ -30,10 +34,6 @@ public class RenderSkeletonHolder extends TileEntitySpecialRenderer { case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; } //why the FUCK did this not commit properl;y - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_CULL_FACE); - RenderHelper.enableStandardItemLighting(); - bindTexture(ResourceManager.skeleton_holder_tex); ResourceManager.skeleton_holder.renderPart("Holder1"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 7def2090a..955ecfdc9 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -371,6 +371,7 @@ container.leadBox=Sicherheitsbehälter container.machineAmmoPress=Munitionspresse container.machineArcWelder=Lichtbogenschweißer container.machineArcFurnaceLarge=Lichtbogenofen +container.machineAssemblyMachine=Montagemaschine container.machineBoiler=Ölwärmer container.machineChemicalFactory=Chemiefabrik container.machineChemicalPlant=Chemiewerk @@ -4347,8 +4348,9 @@ tile.machine_arc_welder.name=Lichtbogenschweißer tile.machine_armor_table.name=Rüstungsmodifikationstisch tile.machine_ashpit.name=Aschekasten tile.machine_ashpit.desc=Sammelt Asche von Feuerbüchsen und Heizöfen -tile.machine_assembler.name=Fertigungsmaschine +tile.machine_assembler.name=Fertigungsmaschine (Legacy) tile.machine_assemfac.name=Fertigungsfabrik +tile.machine_assembly_machine.name=Montagemaschine tile.machine_autocrafter.name=Automatische Werkbank tile.machine_autosaw.name=Automatische Kreissäge tile.machine_autosaw.desc=Schneidet Pflanzen nieder, pflanzt Bäume nach$Akzeptiert:$-Holzöl$-Ethanol$-Fischöl$-Schweröl diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index be8eeaa6e..b70a4e262 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -773,6 +773,7 @@ container.leadBox=Containment Box container.machineAmmoPress=Ammo Press container.machineArcWelder=Arc Welder container.machineArcFurnaceLarge=Arc Furnace +container.machineAssemblyMachine=Assembly Machine container.machineBoiler=Oil Heater container.machineChemicalFactory=Chemical Factory container.machineChemicalPlant=Chemical Plant @@ -5480,8 +5481,9 @@ tile.machine_arc_welder.name=Arc Welder tile.machine_armor_table.name=Armor Modification Table tile.machine_ashpit.name=Ashpit tile.machine_ashpit.desc=Collects ashes from fireboxes and heating ovens -tile.machine_assembler.name=Assembly Machine +tile.machine_assembler.name=Assembly Machine (Legacy) tile.machine_assemfac.name=Assembly Factory +tile.machine_assembly_machine.name=Assembly Machine tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_autosaw.name=Automatic Buzz Saw tile.machine_autosaw.desc=Cuts down nearby plants, re-plants trees$Accepts:$-Wood oil$-Ethanol$-Fish oil$-Heavy oil diff --git a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj index bf0e3b1c4..1b79436d5 100644 --- a/src/main/resources/assets/hbm/models/machines/assembly_machine.obj +++ b/src/main/resources/assets/hbm/models/machines/assembly_machine.obj @@ -578,12 +578,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.720395 0.629566 -vt 0.707282 0.611111 -vt 0.720395 0.592656 -vt 0.684807 0.624161 -vt 0.684807 0.598061 -vt 0.703351 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -607,12 +607,12 @@ vt 0.947368 0.518519 vt 0.881579 0.574074 vt 0.881579 0.518519 vt 0.861842 0.574074 -vt 0.720395 0.629566 -vt 0.707282 0.611111 -vt 0.720395 0.592656 -vt 0.684807 0.624161 -vt 0.684807 0.598061 -vt 0.703351 0.598061 +vt 0.723684 0.629566 +vt 0.710572 0.611111 +vt 0.723684 0.592656 +vt 0.688096 0.624161 +vt 0.688096 0.598061 +vt 0.706641 0.598061 vt 0.907895 0.481481 vt 0.894737 0.462963 vt 0.907895 0.462963 @@ -649,29 +649,29 @@ vt 0.470395 0.148148 vt 0.417763 0.148148 vt 0.319079 0.148148 vt 0.947368 0.574074 -vt 0.729667 0.598061 -vt 0.733508 0.611111 -vt 0.729667 0.624161 -vt 0.711123 0.624161 -vt 0.711123 0.598061 -vt 0.680966 0.611111 -vt 0.694079 0.592656 -vt 0.707192 0.611111 -vt 0.703351 0.624161 -vt 0.694079 0.629566 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.947368 0.574074 -vt 0.729667 0.598061 -vt 0.733508 0.611111 -vt 0.729667 0.624161 -vt 0.711123 0.624161 -vt 0.711123 0.598061 -vt 0.680966 0.611111 -vt 0.694079 0.592656 -vt 0.707192 0.611111 -vt 0.703351 0.624161 -vt 0.694079 0.629566 +vt 0.732957 0.598061 +vt 0.736797 0.611111 +vt 0.732957 0.624161 +vt 0.714412 0.624161 +vt 0.714412 0.598061 +vt 0.684256 0.611111 +vt 0.697369 0.592656 +vt 0.710482 0.611111 +vt 0.706641 0.624161 +vt 0.697369 0.629566 vt 0.894737 0.481481 vt 0.947368 0.462963 vt 0.319079 0.296296 diff --git a/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png b/src/main/resources/assets/hbm/textures/blocks/pneumatic_tube_connector.png index 1a0327a1a6fa923581191f2307459f461157af23..133f16515b841b72527b5a39d54085787c0a2844 100644 GIT binary patch delta 312 zcmV-80muHr0^$OYGk*aYNkl7xV5dKnGLPTs#2q6ZDEMW1#l!?6yYoDN< z`yd^dcmrO8DHB5$gseo0P*r(is}f~OhhW!su3b9xBrkX0&-r`~;Kd^WEsG1kS zAzm~-U^E_(Zd9EuH!D;!Z`;1RuAjH$05#F(FgeI<)JgfZhWkgeyQ8uuA4gPB-VB3sqx3>!Hu* z&PLh>n)Byp3^9Dr+jP?WCh&TFcQ~C*9E}I~=`#TUt}g!nKhqbl=#dMOF3KT22Gk*a2NklqDUwIu1Ui-QkB!vF8RpX4V7H0=F(=>`k*of-Ph3^|XH z^B4sexZIyug=a(NcXR^)D7a|E!edHNX@j0KZN&WLkThU=;D3I50EbgGsGJ64@6St} zVA%t*8kJ{mut32@we5G+U3WwptnF%+HSBZS0F-TKS*D0h)2!FBhSg#MQ4|3HJkL|& zvWDe6ZZ&9wtodr7S0)V#E)X8mMxW&~>yR}+x6#l^+sU~6X0S=Fil*@rEqj2r&jbKS eRQ~@z(+js6a1oopDE09G0000DDlF+FR?F&izoO;{4`@Zjvd-oaSV&XN{ z&29@zI9S3Vk^zwnh-Jvd2$-ALmLc>#b}hO|f1Om1ASQGcnHcd({Tpd@UU8 zb9b|oQ{8lSbn0OJADlWVgo4PCfE1BVLXeu+q12&9^Wy}e9~{Sh_q^YI+}*2?ih*5U zHabl-(?Bx~0^t$}mr!^-Pv;zro|HJBPZt0Pg-5GDOyn-B6@N-)J;SQ90!6cicYXS^ z9{0M~?QI!~l1^MyD@)l)0MpkQCzF?iMj6=kWgGyct^T#2Z*-c3!lP)`;O-HCtIb_$ zf#dROj%!rSG}ya!&`cu%`@WwT@rY~GNLV{O&z$Hu4vynw@)4_<25KN&X}kZ4K)AmJ z#=UL^uq+G9vTZW?hz*2G?r3N8>?YWtwDpNUTLAEo(Mkc-B^b$msq}+LhFeD>LmU>}-GAIUQf4|B`b| S(AW?F0000@RRNTC#wPTeG>QyjvJN&4#I8Sg#ky!Xz%Pa%V$ zRSWB_2AZLx89IUI6L>yrZ^nGN;e7I;B>8IA0ATIS0O%fF(tqpp0hmlzGOFC5U{qrv zfbER1nkA`0E?ZcBeZ%;ji{o0VK4%m4GEjzAEli1la-}FeP1euVTMgFUjDk^x@jC#` z?x{3DAxvs=BJEzMA75KDbWW}wQl~#2=9w=yaVGcAHvp(YoJ8RH0JyG;>$*S`Y!bar zAI;EF1zBd0gnwq}Ql1)kK91c^HN+m6rip2qQUk|s6L>z#>zNr&rYo#wDSjisK{-#s zsHQe@I(UhDLi6u2Dp}Iq{$BW(!S&)ZrP!bSo%~an20000+5cHB<8?kSW20ZS=}d+fnq7Itfq=*Yt1@a>60_cFj)XF zJikyHbW713&pFeK3VOSR?Ti!fX0u6*xNK*P-fp28mB=7|VR5;xi|e||Sg$jP3_|HC zfxjq}US#0dmU|KqLLh`t#vI!slpfiw^qJ1r^rawRcK`~7!pX{gOYkF5LyH50&a_7b%- g9%e%)SnZD3Z-UH_nIKn+<^TWy07*qoM6N<$f+vZy(f|Me diff --git a/src/main/resources/assets/hbm/textures/items/canister_biofuel.png b/src/main/resources/assets/hbm/textures/items/canister_biofuel.png deleted file mode 100644 index 5e509e6b80799c0a8b270869d235e8d7df96a281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmV;x0YCnUP)k+K1P`#{y{B zKz0$j6ogU0BO#>-@x1p7ClD);h}T%QbJtcA9Pwr%Nl zVR(fOuh6{!V+_tYMBwPCU^<1H3rx2QRh2+H0g$>DMOy9Z_VyB^3Uv+V!yJ-@XpF&H zi!lZfuFb2x<1n&(Z z$$E@&73>axwHD`+srh_Pr_&*X6yVpGI{=Ht0)QA($ET-vdcEV7JFqsbKLWh>D;FuO zsxmaqJ7rk{Ai`E<01?4CM~rZKnld>!C8yf+dGjTP`VQ3@g=%5+hbIxTOJr%RrKH2Hae z2%3aQ*p{$ep(|i_<`xJGhihGBx}DYebk58eu4=JZ=xjD)wOUcvHOuAF@I=|insr@M zmgQ4g0Fvv+X0!P(@eN@9<|9qhaR2-Ts>=I!Z*{xf@_W-Cr2{yfPJ|G!)^a=^i7}F8 z8LA%?;LqQ$H=xc8j4>ohf`~924$1SJZ$CbpEX(lT^Xlap)C&NJF)|noh%sXA`TP6N zFGf`<%aUjAbqCUkV2r_9i!lZfVKSL8pMO$-s;cnbQxrx23{;g60wRKlpsG|=1%Pu7 zRc&288bMVN5sWdUX^L|W5uq$gLI}hdi81yAthFS`+0=f&XEYj7*EQbzPRw4w;cx&T zgg^*^^?J>8I&IxqYf;sHfOD>OQ4|H(=`5bnE~+Td>xW=Q+FGuI;I6dt6D9V2veSrMNlG%b{GdUe+ceIOo{k|LSNS0N16> UPSvZUiU0rr07*qoM6N<$g2^e;O#lD@ diff --git a/src/main/resources/assets/hbm/textures/items/canister_blank.png b/src/main/resources/assets/hbm/textures/items/canister_blank.png index 9e19878bc2ad4c8583d33e118f159ec5e37ba27f..0524cbe1d224218436c66b826765752ccfe08e8d 100644 GIT binary patch delta 193 zcmcb>e3x;8NGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8Z$2u~Ns5DWigiGl+hOAk7Pg?+Q1a`MBEkI5pIF%0WCmPER`wmQ1Fv^+dJ+nne5 zxw*+detcARbe^%mL}E|X*RF@Rwq_^HifBk;wzs#xW5s>sh8>sN!30Jg9)=a0q*zwv ley#&r!j~H1nda-upao=e05J$$3Z4w2JYD@<);T3K0Ra2HLf`-Z delta 438 zcmV;n0ZIPd0nh`GB!2{RLP=Bz2nYy#2xN!=00D!) znz`U6bPs|q!WFp;SK%T8I#VzSYDWhS4BcIS@G!i5pa1b|)>YiYyCX)%f z-41Il+wE5IOX;7Q)>_K4{7nmh`TjT@4*w+vXjv?ZLaM6be1AS8BE)gb>2zYTSbU7q z8XS*Dx!rEu?|16DCXVA57=Yz+`37qJfl>-%3?T%1y&id{PHwuQITd>zUw>q`(q gAc`VZt5r+$2au@B`n#pLLI3~&07*qoM6N<$g6Jf{%K!iX diff --git a/src/main/resources/assets/hbm/textures/items/canister_canola.png b/src/main/resources/assets/hbm/textures/items/canister_canola.png deleted file mode 100644 index 7f5a44f9151c048fe296ef25ea16037549dfec9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmV;b0agBqP)1u2W+5S=A>pSd;Q)FHZ78+!2wGcv0x#e(Y%D2k zJOMO@0@%RrLP5d0J7e*&!hkMun#ugU&%Ez9pWY&`nSzE zjtRr?oE89cxR^{P{}Kau7S|tvOOh`Z3vdoYhKNcn8aO+-e2uHKeHk0OoU< zuOCi9UJaB|7z5Tqy$-V(T-=~K9q4x9^%++R0LXKwRAkn>)5}|wa}b8`^5{dnA}XcO z+M$%VXt&|>O$1RSE{Zt60-SSXnTV~GLPn9C1%a&fk!O7juojepW>ZAgiuEj$Sb1Io z&{|`5o;Dk3G$4+}`aWg}V7s+|yq0A!9z(BJxD)%%l>mZ3E*T@m>UJSXBo0WN*k9t0k{hs}iHIo~Ay)`vt9~d6vulo^$*(mocZmaMGGZqZC;SfwdCx?#b7D14%rW Ue#f&!lmGw#07*qoM6N<$f~J_VNdN!< diff --git a/src/main/resources/assets/hbm/textures/items/canister_empty.png b/src/main/resources/assets/hbm/textures/items/canister_empty.png index 36c11231afd707e4a594f18815272d13529af96e..a41347e9525b4b57f7dd1178de906f44c24cd5d6 100644 GIT binary patch delta 355 zcmV-p0i6EH1C9fbG=D`&L_t(Ijg6DBs=_c7hQD4MI|YYAaVWSuIQasub@m-Px%DAB z_y~^fK7w=;x)eG&NT3$UAcc-~N=R=4dZwJ@e1FdQ(+2z)S(c4@{d_(-pU(ln>{l>N zQ-)yxpss70rWvcM3MK-J#lqb3csznE%f>WK0XQ5E0BklJl7A#I%*=+D%O&&qoY(8c z`~4ob+bvQ`ilQJ4L*h6lNfPe&yDI?Dbsb&TnOrGF+qUfYd$VW56M@}s$LVx32YH^; zwyhUZO8GlD9*+j{f!c%1}ydEXniy zn-&1~_i;QP|4R(evbf!DwW=!4=QFBGuh-*rIg9B+;(`V+_tYM1+37PnxDI77H^TkBQ@$caWDM)^$y%)1j_wto{97E|*4C$@84~ zeBOezhG>kzT8l9T5n(hMv0kqgpePFBI3~+7J_1yg5CS5Ch@h$zMFD{K9#w5zy^Wx% zhzQ0QqA0?9kAH}e=Q$ySX0RUt)>@qVHFdpS84L!LWl0>zt(YGHx7!VX5CS0t4u=Di z$)s^-twmKo1HAW*i!95CxWrYV=prRk|^b6n23mo2>9`14SnS)T$C!F$hUvlwYPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0mw;2K~y+TeN#(r z6G0Gt)zco^pn&8>>?{ZbB*P6@h8uXr6}d;`WuzRyAR*hri9Z>H?U9|hKUDS1!lgjo zXf)l`U9Vn!hH!+zU=aKLK1QPvilV@9I8^8Vf~mg>;yj)rEE1e3`G*Vi{#E(;LZ z+WI_{#D~K+A_715_k2RgbA#E;;qv0$e^XHhA^1pSFy{68&lJsOWxu-vVvP9m{_PVY zmBOCGuTY}gj?r!#+};8o+vn8n0%vE0tDh6rr=bXlp9i;vwT9IM&LSlHrx)iGLgc~% z--aVaqPq}1tZAjCICQ%P%eak;u;J7Qy&jO+I&=@@* zir|su3!FoW_D+ssGbzv! z6oE8NQV<2Fr<5+|d4^&yqb;=|l;x(nTtgA;cE2#&EU;RE{|E3OMNFrTix^o^K$b}t z^e{ddO&JuE<*AJlktniso>5LO&n>=wzBuv${sNw9$G5M^G(-RZ002ovPDHLkV1j#j B{;L20 diff --git a/src/main/resources/assets/hbm/textures/items/canister_fracksol.png b/src/main/resources/assets/hbm/textures/items/canister_fracksol.png deleted file mode 100644 index 8111eab89d6322eaeab9c900054bbf19436625d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmV=0VyFV9{>@A z@Bthmg3JLa0Y_k+4&lIiEAOr&0^2j)1jd&4%yOc$>7FW8b(dkMhQpx_1_Q?9F?C%t z8jTDWl>J+?u4{^-xCje?+kH$Xlm7w(G$amRJlFYr&TKYARq1xSOs7+3N1s})G!(2> zD?$iZYgsOr#287_6uo~}0m=`b_lO!hFvj4VLqzEHdgOV|x7Tk?nx$9C;u~+~QLI7ZLa>~_%17K~(S_|4dM8ksjeyif;@hMLZZ*b48I9jZ~ zi3sPbp+H1%&JjZ3(amcls&qOX9wZU73GH(E?;YfMPFa@Qo~mxc<(%8Q!hXg#LD_iS h07Srh`0}-Z`3)5Z!{ThFwfO)5002ovPDHLkV1mZ_)a(EN diff --git a/src/main/resources/assets/hbm/textures/items/canister_fuel.png b/src/main/resources/assets/hbm/textures/items/canister_fuel.png deleted file mode 100644 index 359fba8c8fe156d12d8cc377d122b5f1257d2ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu@#P)9RogsE8+#_t*?fR$3L zz#9n#EiSA`iIdo-h=XG9Lc}9YF(1!=o_F4foM|?jwbSX;VzE#Zh539QxuE#D#iA&z zR;x>15Y8ugp8uB_dJ)^3oAx2k-It{nFL94ggLCKVm9X7x>~=db4%p!ex3ssk7Xfh` z8;{2tWXSP>=nB^z=$`=C@ApRC?WfI;L@k#1GJrfu5JC_;o_d2k%i284T3w3aWAwVv zG>xjN)Mz@$x3UCjHy=ihhk(Q3Aj0)zV%&k2s8Dy~uYeGOBuT)p&Bm)V^|On9(y)Xc zV7*@B*un~5w_ESil(YE5HuL~#nhGHZc)(jMw_ESB>{z0w>H+GymL!P-UU!BGzL({n z=+yww>%wR>a`*V?$Jtto7mkk?hBtcVkDorusn(OB!5E(hp5Iu9dunKgEyn-=002ov JPDHLkV1mMS!p{Hz diff --git a/src/main/resources/assets/hbm/textures/items/canister_gasoline.png b/src/main/resources/assets/hbm/textures/items/canister_gasoline.png deleted file mode 100644 index 1b466069cf6b4f726d94f2d531091d716c4c180c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmV;!0X+VRP)zU53XL=F~?=n3_;AiKKpQ%L5?W$t*?;@a002ovPDHLkV1lF6#V7y( diff --git a/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png b/src/main/resources/assets/hbm/textures/items/canister_heatingoil.png deleted file mode 100644 index e8654568e2cb767d50f8217da3f36eb4ab5f5afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)g~sSa1X1!Uy1*Z~`yj3=W%k z#dwl&dxV_Ga&@tA?4&)x5hbr-%7`{$Ifz!1%(`whP{9z|8pa`GYMMfB4a?{+UVw*lxF|Dk5^&4~IEp!vKCR zyP%{7B0`pBm>GGVQ`dKVyZSA|;TdI_GrlP7Bmf}Bh;t5A#XY=!|5b^Zu`uD|`FR3K zQV@~DiZL=6obmP3djkj|@Xi@kOtVM;W`?Q~W5mobGeQVENAEG~N_NM97$YJ=Q4|kB z#_jDrs)|O?Qvl~2-tR=M*K7LyJ|Wywmic3vrvRJH24MG_D%aOFmzQr3>YTuF8xnx` z{?N*sn>)(#HEr8c6a@gW)5K?L;Jrsx84O-wX7qYJR;v{vJMo(%K&Op$U9((1x|u5^e-P2=uqRC{UXAa(F&oK8ZsDGfoh zf{4)X_qknGY(&h*(Ulrwpj_)( zK~+`cc@BVF0*DCSdt!`SzkH5}(ChUm%MxR{|JBJWSZi4<78Litk1>5rl6LZ=&amx8 dX-it0_yAQgt5u4}Bmn>b002ovPDHLkV1mmW$Ibu% diff --git a/src/main/resources/assets/hbm/textures/items/canister_kerosene.png b/src/main/resources/assets/hbm/textures/items/canister_kerosene.png deleted file mode 100644 index 61649e01baff42bf2048322b212bf048513848ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)l z*ELmDy_E%^^>R@Z#k;~gfQkLVzw0^I&LRlMb|^DH;~Retsx$yBmw4|n%CM9rAp~-j zb0H!C-?`iYHSa)cthGdmoY)g?M>7=zZDm?AyZ<8S^|09@%9Frc7#W)VhOFedtNjWo z5o1K5=zZ#unT#lrQcAq{JUorV0AsM$0VaYtYE|68IC10L@00SFTC-ZQBt zoP9i7+aYK)f*c04vJ7JkZPmt!V_*i%t2ud|uMJ6TS5qNIthEFQbm@{(;>aFRmgRHn zD^`t2^A(KYYIemfw>r=x(Or_7Ryf-jm#r78nySkfUWQV O0000=LDJDA#;Y@Avc(u zfK9SU4nP(p>}-QED@1TtWifzom|>LObxHsC`@hR^b|#aFjmKkVvl(?=Go4NyFC2Ml zSl2a0QM{xDAUeM+7K{H919T7{?%vvFvthMb0gxmKMN#na>+ffybO_qEC4_*8u;1?q zA&_Mm_qS#M_um#5Mx73vb9nDjReHT1Wm$3e@ZDuuMxN)~-@dY|1^^)hy!Qu^#|J-r z`QglrsuJG69(7DQ5u9^~2+lcFmEmy6=XY-mV7*>*b7PccH$}(5%m^W%s;DYQAwV3* znAwTy$p~hKs^Xj@O;e&MLRDEVmxqEOgex702;O@Dw%aZJexIgk$n*Rx<`sk8ZU;OT z*|sh7`JB;cbfOahvnvL19G@tvsv^&Gnx-L5QveRNJa3??L{UTtfx%#anUN$3P1E2G z?0^0t==_3+P?jZiU7u!V;JsjGM3K8#oQu^wF3K^h$dL}>7(V^{)zSO~=yJX0%cLH# P00000NkvXXu0mjfGsVpV diff --git a/src/main/resources/assets/hbm/textures/items/canister_napalm.png b/src/main/resources/assets/hbm/textures/items/canister_napalm.png index 66d2fae42382278729964d7502ef18479e424f2f..1c65524d3bc5465f02080ead482ae5c93df764ab 100644 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|+7sVrI15OLitM%rr(6kAn!^m%1vWhK*O9334)Lqqxb`PFA@D=RCP zmzQg6YsbaK85kJ!^z56EBS8!~Yq4jm}8<2!KD;7>U43!LT~GIk(}NQsRmXgVaR z>ur1xQ&q=7-Z9;cds1*Xd(}RtO0lL^t0j#_18XhLIXaz=;(rq9T}9^{gTdf3F92r! z_HMWPUuFOWkY$-zYv~=GlIJLiQ`eImew>jhU&w*xE`4pwsE7G)?8Uy~*qQV`7Xv z`TPiLEpHyYhcP5c0d&o z*Xjr4c}|+9vxdk&+5p5DF~;D%=gPr#M1*p=jB^g9=Gp&j0ycJ_wWi6h+Ugst^cHOS)E)O;*_`1G91?%qIl=0>4myU<8Nk z)t!=sNCuI>beZl}0-01j7d?|nr=1Kws6{>Mp1Su{341l2PIWSwFrUu}AuyZGgh$H! zs~JLIxm-S`1;FiZ7K_Dyi93MPSDw1A>3Km_8J|Aa>+2OCKm2$wN(->vZiz7>BE%R; zDUs(HXXhxur^_y=H3JdBT8paE@AoN+nv1tzB+pOqKI80sq(=b&DJ6_Cq?8b8&cA>6 zRaBKotSHfU5e9_t{>~BY@3j13-+C7$a9#KN*dl z?c5my=n;T(ZugW$QQ`el>bfS&8V4!Ssm=_nwZs@14xgZ^IOnLU3X#UU+_W=vp0Owj zR;xezU94470&5Si?2Lr_k8+pwPLRO#;M?c#EzMuYRJr}9ukn2V00005JitoLLwv<1OZvG0Eyq>qxlQiMMxwPF&lyi*fVd@ zR|JL9c6J`?9^JVf8}4ekT1|W`ORG(w8UjZV5F@`M5h~pR$p{gpp_kb;>YUy-q^KLimvOTpTWNGjWNb(t&P^&%=2uD zqA&peZ*bEz0F-43KwZ~lS>|T`o&-Lh4^m3XvLudU@;oQYGJm#hb2E<)j^jWnMccNn z=ff8Ven3Y+t)eI#?1yFHX__v*#|*4Uk|Y2D z{3-yDBni_raU2Iih+sdsf|N2C@q2sO7y~r(QK!8ZK+Gu?GOI@QokD!k^BA5<#Itp$n%`j>BMHUQU3(+-ivdN z$K%2K{U*53Q$U+wMJ`=h_GBPan6ZzP5`Q^LaFf!*|VvOGbT5F6k06d>h=JPpS*HM<` zXw9#H*Xsp92zCMQJ;&pbx~>Pi{x)9$)>^dIOePcBwxy~noO2XK0YFNL&l&+@j2L4G zA+T61NGUO$PU*UCQ131K8vR0+Wi(C0^?DuNQc6R(j4?wthMRmU^+D-%`+*oE)>?ME b-Du_qo`AEIJ!o%^00000NkvXXu0mjf&z!M4 diff --git a/src/main/resources/assets/hbm/textures/items/canister_petroil.png b/src/main/resources/assets/hbm/textures/items/canister_petroil.png deleted file mode 100644 index bc5aa6314620a337fbb58613419b3699bc7a9a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym zrV9N&)%QOJ5T2g0i_L~kfSD0v%wknA%R->^o@jP*buNOLp{gLlm#RX%&!D=_%}ptf zE`W0`HxbzFcJz8Z2q9ZP3C31TkRdNtqt|L-xps?lhq!{Lz0WI_mm@px=_r|esoAq3jC zeXkb)_xfWxoqnhpppf|Y`#`&{V?Gb4!trs%-Cg4HhP_q_1?%;i7$ergY6U4J`hB=k z6yV$KE~v=B7=v>T5jZ)in9bnJFHFA=O#@dK8MGGwd1_VV({BEL{f$wDwuPUrgcKHx zF<5Ic#vr1cpTnQewE{do2AT%$?+;|4s>B!(QA9vBHv)L?P>s*3-n5{qhzQ0&U4O!R zgGiPhVWi5i*s4jVzHpt>k&c@@Wti}u4@29*r@^_A~@%W5zfwXCPzmVA%th?t5^bxSFqMHo6UK6c)3$eIG3k8 sx4SqytGQj2t=H|diGcU;<6qhH9|pFrwJ5+fVE_OC07*qoM6N<$g0}CGmKpCORwO?GvL zb$U)7)b6SrjAmyhaY@~}sQ=^ttIP1J7K??>=W|x86(Izc%cbFsvVUua5U8r^EiC}< z^<%Ty{Fk@~`0{Z`)6{6zpsGB4{-E3KmLD(r&nPXx`FtkEh_#l}=|oD2>2!)}sQ^Fs z^gu0uF$U)xBEoPu2Qr9&A-g{KFXW4cEB7!l7JkRmo zBO+8)MU0V@Al(C4YjN&k>TozP8jT1cP!z?VnD+q3;}L)uBQZwS>ov34?B>qe&IY>x z@BPh1S(X$)z6AcVl>4&c-Qw0^-_%Wk)0zu(__ vs^DDq8*Z?j5WUm99?Es>YEb|W)E&()+bh3qQw-)%00000NkvXXu0mjft;Nw8 diff --git a/src/main/resources/assets/hbm/textures/items/canister_superfuel.png b/src/main/resources/assets/hbm/textures/items/canister_superfuel.png deleted file mode 100644 index f38d02ff7ad175f262f827122d3bb7a81e901c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)c4|F9 zdbx@SmJVAh5U7x~JCouf*=Okxo^EHDkN=;U6<)<~IJCiFz<4|+#>i+i5{`sBl#DS_ z*Y&Yp0Q~F6WHNbI^B&;K@*9gk3qHh04C7OAZ4dc@-`sXuX<688Hl&nrI5L@>GkyA8 zabs89*inFp;JrstPK#5fOu6HS^yw1_9D?i(G3QJ{LCzWXzx<1zVi+|wfzK^SYX%~M za}E(fO}XHLuhn-0n8!JRz>FE405c<{gqor#hB1$G07_qC$#$v^S}-$I6+x&zR+Lhr zC^a=HrDm|?Zh&(R?;BC8)rwxPM-c<)Ih&N;`-I4MquG47;4^V|Zow&0v&`Z(o@r(Mpn w;c1S`%A6QYXd5-$V+W-In07*qoM6N<$g3mm}lmGw# diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel.png index 8eb04cde2572e496c7d2ca7f8bb6321ac2b1d15f..fdc4318612fa761aed083d119c28fc133ed9d215 100644 GIT binary patch delta 289 zcmaFMxRGgsWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Z2;1l8+ z85!x|;80v#tgWrx)6=tH!2%y2pIy6lUA}x7sAS^Z)9Zm0S4ogx@P8O!*mOqcJW!Og zz$3Dlfr0NZ2s0kfUy%Y7%<-&uaSYK2F6|5CJD|Yf+^x{}JHBG=i+|USwCr=x_GWHzV=8wj0;t^|@Kk?rY z3p0N)&18;P_f73ezf*JKIKN1Te7rBxzDnF?D@$bZtp}5V7W1V>c&7RKGH6KwIUGO? S0+)h8QVgE1elF{r5}E)&t7ymo delta 220 zcmV<203-jg0__2i8Gi-<001BJ|6u?C00eVFNmK|32nc)#WQYI&0HjGoK~y-6-IL7? z!ypVsU#cGQ0AYO;saUmIV~<+ Wi&!*$Scgsk00000fhdc0;L0xGk*bGNklFx z>%m%Uj4@biIh{_P8+Ty`YORq{4uwMq0nj>=ad%T|4SnTR+Thiu3s##P1onn$PF$klqDd Z{QyTrvYXZF2jl<%002ovPDHLkV1mY1t}*}s delta 246 zcmV69lw2Y9In)pax=~1`tpMRTDQA z0RQY~&1;&q+urUc4+0lB2=FIvXBQy^-`hFox3P_LOC%yNGng5wigjJz65Wo;L<9g; zvZ|ICGpk4*#|q300MPe+mAv_nXb6U305c=!T=~1MgQ_+}4R67Q7$eNARIzX4BY}ui z=dvt?^b)TLxQO^X&kn!=cuL8~adZHF9Pj;_@<)Uae43{6vWQf6jIpWUR0AR^il>xL wg=|`I_a^8HRRymNbD&lHt5x3P+t2hjp4+v4w6(q{P5=M^07*qoM6N<$f=3%|vj6}9 diff --git a/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png b/src/main/resources/assets/hbm/textures/items/fluid_barrel_overlay.png index 35cfb942d2daf603ff296520e107bf758703fae8..518122010d2046d12f05a8818cded6184e8ccec2 100644 GIT binary patch delta 164 zcmV;V09*f@0nh=EG=GOlL_t(IjqQ=K4Z|=D1Yd!d)jTS=iwgD{K1QekRb5qdz4cAU2o1gytjGa?x!Wp?9A-@zK6EW233s`RRsWuNX&chOX;>K zkMLD+IbjZ*VP>xjJ|zl>C|zwKB519l)|w72J)4+0K5^V`W*rz~fQT0V4{!(4_(jYF Sy0`!U0000IYdY*^ty4|tZAPWGkwRA?uaR8|68l{vKvSmx~-E52jpns~W^&=Q#$nzYfRBuev z)Yiui0PuaEIF9>$5Cls>3xI=@Q|@kW2*a?C-x+uJ_9=>DeS*vB6~{-1{RsCDj{uxS z(Pkq6BuN55Gk^bF+t#YHzQRvxV?fn3zXvpJ%g%84PYGVXZvIadUC%^BJQ5CacHn`yGf5A{Q3nylgUp@Jp^BqEfC zEB%&b=?$}4u0(gQ9lh~4g1c8UBZPn?BvDF15;^B4WPMxxV7oh}lmLh^c0I!l{(y%s inAy35&l(I*c|JQ#Vt95KbT@5`@G7 z3Gt4xVR4;h3hAAbKQuc)q0&1=1Rb~JH#25hpV+^#`Je&Q( rV@T>o?_IAtn7oi<2O{G7-e(2c+%)o31`!?r0000#WBR9H#tFqbqlL|zue#Y_xJYx|8d3O;p8b(rl@3a#xY9(frzLm zr&N>hpa1{o8|e!$e~>Ep|F5>~`T6<5S;sXLSQuVZinK;GU%Jcy1fH&bF6*2UngF?q BC$|6q diff --git a/src/main/resources/assets/hbm/textures/items/gas_bottle.png b/src/main/resources/assets/hbm/textures/items/gas_bottle.png index 7776838e646c5ab687528385b20f27752373834e..4e2b038df7f7fd1520d84ef1d98c473d347060fb 100644 GIT binary patch delta 167 zcmV;Y09gOY0n-7HG=GXoL_t(Ijop&54a6V}MSpGB@jT0_qH)PH&85W?rIs;;RE zxSMAHB7!l-;cm{kX0V^ZvH^gT!7|`(o&$);?*_~aRsA}T%OI}|07PW_)zw-ryKfnZ VI3tih*Hi!i002ovPDHLkV1k#4g(}=(D)t@ za*1@QqD*Pov(n1IZ&Pd4oU>l-99PFFCBzu05AWB0{j7xG=H;6L_t(IjkS`o4Z|Q1MSn7c2SBXiI>n8UH8O{b?7#+g#R{Y{ z&80a-vLZIPbde+5C!@%}Lh$eN^Z_t5-LLw%UDWcNt;5%Ig2)?0q(o!}t;#v4P1Dp5 z0zlVwI*z0EeQ(}=+8S=#7R-#45&$5^h!DcUzuAHJ{<{{DO-WL-#63DDfSHkV{@E*~ z)Dg@(s3rigAgB)5tK$Ng`G10x5=6x8WA!To01@f@>4srg^?m?n=t;Go8GE$=0000< KMNUMnLSTYD$YfUl delta 218 zcmV<0044wY0fqvQG=IHGL_t(IjbmV-C8$gC`Cpgh^BjmlU*9lnOLh3q zz`(%ZHTwV~Nd|lnHDp-x=`O>(dGjzd!T=L4iPqNE|N8p+3@R!r3`t2zIK9D)O|Y%4 z?Z1J60fT~q0s{vJ2gC2*zZn!16dKN-Ki^1{7hb%0!NAYY&r|U0*Dr==&z>>7c=3Ya z-Me>KU4Yd92?+@X1qB5Ld3kvTHa0efj~_oWeEs?rs{uH}fLJhU02K_NI2}+70EtLL U5)$@|zW@LL07*qoM6N<$f>hUDg8%>k diff --git a/src/main/resources/assets/hbm/textures/items/gas_label.png b/src/main/resources/assets/hbm/textures/items/gas_label.png index eee087c9ea3b9175ded8388710f356a01fe77f4f..5c0dde5432c6f7079812eff98a2b06bf493c7a8e 100644 GIT binary patch delta 96 zcmV-m0H6PMjscJ~T181jK~y-6?ar|cz%UF0!55GrwEuJ}Z8cKIERe!>8(&F)AmREG zN&3p4l~QJ6X8WsiP5}ZG5&I9SiZKS=jk_OQxR$(ct{q25)d@ua00009=KfSD cJa~bDLGG%o=bCkR6XL7HboV+go&jcx-7&U4H7-LA1gz0n|5qN`h zj>F*)QAGi1nzGq!8b)vK_xk{>*XzpxN-2s}4}jN~Z@S%XAStUc08bBJ*9qp!HXmh~yF_V#M26$Zm#yqP7&3V_;y18~yta{{GO`g>O|58Oy$g`Tq z=U>_5djcOa8NFW*NYfN(PQf|H{p}}02!y!%e+q-a0D%2|A9NuET5FthIOigQXqk$l zI9h9&&1PYIrxd&04j@{l_z(Wp^~i-fHTwDiQ46v*Ee~64od5s;07*qoM6N<$f;~gC A=l}o! delta 260 zcmdnMyntzfNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao@Fyrz3 z6)8YLi4xa{lHmNblJdl&REC1Y%)Ao4ywnl}6Fmbx%N*l6KcJe4o-U3d7XC~7FLEAG z;9;G+p1H(gzw80km;{3tPh}3!D+~;tu6{1- HoD!M<*6dqa diff --git a/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png b/src/main/resources/assets/hbm/textures/items/inf_water_mk2.png index 9c53f6f1ed7da78ee586a09cd5283e7b9cfe5120..2513580a39729b46a8cd9949f16ede771c23f429 100644 GIT binary patch delta 394 zcmV;50d@Yb1GEE>G=FPJL_t(IjeU|mZo)tiMjug*UQMML<$pC?ID%b!lC zRyFrn6#@i7P!mfj0dgrNm&-*NwaVf`D5a#=>uCmQnieL6VSlJhG=lwp55QuvAWhR6 zMHq$vwA=0G5p3JWFbt;CX%!uS!C(MD`F%8lBuOv~gVAWD6$v2#$g+(4{jO1I2CnOJ zJRWPpLfq|k0f^(c+2DLWv)xSq*enm2rm0A_y9w`~;Cm~L;Guk(uZMhne6v{|n6HPL z*!NcW-io*QwSRepqPRF`<4Dm|yZ%W~j_q#3Y#cEgN42iyP>bX^PHx+_>N*=osz?Z- zOsvi`K=UHGt_$cw`27Lr=>^j?>2$pRf1%&+1JpKA2tk%*T(8&W5sERSlmtPb9_eGX#fBK delta 388 zcmV-~0ek+m1Fr*+G=FAEL_t(Ijir;lY63wNg+C?W42t>$+XO{~1v_gAq}aw%v9h+4 zQ~_VXCWW;{5MMx>Edn+QHc=aGQ%OLOm1V|hHiag{_>%-rdFRf7^UWE!QlWDP^?E%} zN};tzYfZP?J-K`Hb5N~T10e+IbQ&Q9Qc9$hY`5FM7(=hu3xAz8D3{AYCX*o&i2!_E z1}K$ED5WsQ1g`6bP8tBr=W~P*0Sk1YSGV~8&gycU`O?0&@Z-0k)7w+#M?&ns&wu6|>{tcp(631~^uh)2<$7Zu(I2@w2K8kSE@6Re*mUZxq i%jJ?&RlfQ&U9AtLV7X%xo<7z90000v#mt{ From 9cf7cc6643222a108f14c2a372f244c2e4d0cb5b Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 16 Jul 2025 21:59:48 +0200 Subject: [PATCH 45/45] bluh --- .../com/hbm/items/weapon/sedna/factory/XFactory762mm.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 9ed290110..85e0d1b47 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 @@ -157,7 +157,6 @@ public class XFactory762mm { @SuppressWarnings("incomplete-switch") public static BiFunction LAMBDA_CARBINE_ANIMS = (stack, type) -> { int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory); - boolean empty = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, MainRegistry.proxy.me().inventory) <= ammo; switch(type) { case EQUIP: return new BusAnimation() .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); @@ -170,7 +169,7 @@ public class XFactory762mm { case RELOAD: return new BusAnimation() .addBus("MAG", new BusAnimationSequence().addPos(0, -4, 0, 250, IType.SIN_UP).addPos(0, -4, 0, 750).addPos(0, 0, 0, 500, IType.SIN_DOWN)) .addBus("LIFT", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1000)) - .addBus("BULLET", new BusAnimationSequence().addPos(empty ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); + .addBus("BULLET", new BusAnimationSequence().addPos(ammo == 0 ? 1 : 0, 0, 0, 0).addPos(0, 0, 0, 1000)); case RELOAD_END: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 0).addPos(-25, 0, 0, 750).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -1, 100, IType.SIN_DOWN).addPos(0, 0, -1, 50).addPos(0, 0, 0, 100, IType.SIN_UP)) @@ -182,7 +181,7 @@ public class XFactory762mm { case INSPECT: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().addPos(-25, 0, 0, 250, IType.SIN_FULL).addPos(-25, 0, 0, 1500).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 500).addPos(0, 0, -0.75, 150, IType.SIN_DOWN).addPos(0, 0, -0.75, 1000).addPos(0, 0, 0, 100, IType.SIN_UP)) - .addBus(empty ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); + .addBus(ammo == 0 ? "NULL" : "REL", new BusAnimationSequence().addPos(0, 0.125, 1.25, 0).addPos(0, 0.125, 1.25, 500).addPos(0, 0.125, 0.5, 150, IType.SIN_DOWN).addPos(0, 0.125, 0.5, 1000).addPos(0, 0.125, 1.25, 100, IType.SIN_UP)); } return null;