From 7ae8693841f44671541637911c0ae446ef42086e Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sat, 22 Mar 2025 19:10:06 +0100 Subject: [PATCH 01/32] Sunken Aircraft Carrier structure added. --- .../java/com/hbm/main/StructureManager.java | 4 ++-- .../com/hbm/world/gen/NTMWorldGenerator.java | 10 +++++++++- .../assets/hbm/structures/AircraftCarrier.nbt | Bin 0 -> 33262 bytes 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/AircraftCarrier.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index eca4c4853..f34d7722f 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -56,10 +56,10 @@ public class StructureManager { public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); - + public static final NBTStructure aircraft = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/AircraftCarrier.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); // public static final NBTStructure test_jigsaw_hall = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-hall.nbt")); -} \ No newline at end of file +} diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 42ad900e4..b444188d2 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -36,6 +36,7 @@ public class NTMWorldGenerator implements IWorldGenerator { public NTMWorldGenerator() { final List invalidBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); + final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); @@ -61,6 +62,13 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 3 * 4; }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = oceanBiomes::contains; + structure = new JigsawPiece("aircraft", StructureManager.aircraft); + maxHeight = 46; + spawnWeight = 75 * 5; + }}); + Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); }}; @@ -201,4 +209,4 @@ public class NTMWorldGenerator implements IWorldGenerator { nbtGen.generateStructures(world, rand, chunkProvider, chunkX, chunkZ); } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/hbm/structures/AircraftCarrier.nbt b/src/main/resources/assets/hbm/structures/AircraftCarrier.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3902285e4d994d08f0f0ff4acbf6839a8d01e40e GIT binary patch literal 33262 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 JZ{pLB{s*wdFfIT9 literal 0 HcmV?d00001 From 8bb91eda3c4da3fd3dad8f01cd73d49593d77297 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sat, 22 Mar 2025 21:33:25 +0100 Subject: [PATCH 02/32] Oil Rig item pool --- .../java/com/hbm/itempool/ItemPoolsComponent.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java index 5fbd16c08..51e0ae85d 100644 --- a/src/main/java/com/hbm/itempool/ItemPoolsComponent.java +++ b/src/main/java/com/hbm/itempool/ItemPoolsComponent.java @@ -3,6 +3,7 @@ package com.hbm.itempool; import static com.hbm.lib.HbmChestContents.weighted; import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.Mats; import com.hbm.items.ItemEnums.EnumCokeType; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; @@ -23,6 +24,7 @@ public class ItemPoolsComponent { public static final String POOL_VAULT_LAB = "POOL_VAULT_LAB"; public static final String POOL_VAULT_LOCKERS = "POOL_VAULT_LOCKERS"; public static final String POOL_METEOR_SAFE = "POOL_METEOR_SAFE"; + public static final String POOL_OIL_RIG = "POOL_OIL_RIG"; public static void init() { @@ -197,5 +199,16 @@ public class ItemPoolsComponent { weighted(ModItems.stamp_book, 7, 1, 1, 1), }; }}; + + new ItemPool(POOL_OIL_RIG) {{ + this.pool = new WeightedRandomChestContent[] { + weighted(ModItems.oil_detector, 0, 1, 1, 1), + weighted(ModItems.canister_full, Fluids.OIL.getID(), 1, 4, 5), + weighted(ModBlocks.machine_fraction_tower,0, 0, 1, 1), + weighted(ModBlocks.fraction_spacer,0, 0, 1, 1), + weighted(ModItems.circuit,EnumCircuitType.ANALOG.ordinal(), 1, 4, 1), + weighted(ModItems.circuit, EnumCircuitType.CAPACITOR.ordinal(), 1, 1, 3), + }; + }}; } } From 737fb1e432e9832d26c4ce993cf8938edfdd0fb0 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 22 Mar 2025 23:29:02 +0100 Subject: [PATCH 03/32] go go gadget HIV --- changelog | 1 + .../container/ContainerWeaponTable.java | 32 ++++++++++++++++-- .../inventory/recipes/AmmoPressRecipes.java | 21 ++++++++++++ .../weapon/sedna/factory/GunFactory.java | 2 +- .../weapon/sedna/factory/Orchestras.java | 2 +- .../weapon/sedna/factory/XFactoryEnergy.java | 8 ++--- .../items/weapon/sedna/mods/IWeaponMod.java | 3 ++ .../weapon/sedna/mods/WeaponModCaliber.java | 17 +++++++++- .../weapon/sedna/mods/WeaponModManager.java | 31 +++++++++++++---- .../sedna/mods/WeaponModUziSaturnite.java | 22 ++++++++++++ .../java/com/hbm/main/ResourceManager.java | 1 + .../item/weapon/sedna/ItemRenderUzi.java | 12 ++++--- .../weapon/sedna/ItemRenderUziAkimbo.java | 17 ++++++---- .../machine/storage/TileEntityCrateBase.java | 2 +- src/main/resources/assets/hbm/lang/de_DE.lang | 9 +++++ src/main/resources/assets/hbm/lang/en_US.lang | 9 +++++ .../hbm/textures/items/weapon_mod_sheet.png | Bin 3152 -> 3318 bytes .../weapon_mod_special.skin_saturnite.png | Bin 0 -> 229 bytes .../textures/models/weapons/uzi_saturnite.png | Bin 0 -> 5454 bytes 19 files changed, 163 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png diff --git a/changelog b/changelog index 0a9e331d9..b970bea8a 100644 --- a/changelog +++ b/changelog @@ -43,6 +43,7 @@ * Crates can now be opened when held * Crates will not longer show their contents when locked * Crates found in structures will sometimes contain things that aren't items +* Beam weapons are no longer pinpoint accurate when firing unscoped ## Fixed * Fixed animation errors on the MAS-36 diff --git a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java index d4528cac9..2cdbc4e16 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java +++ b/src/main/java/com/hbm/inventory/container/ContainerWeaponTable.java @@ -2,6 +2,7 @@ package com.hbm.inventory.container; import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.mods.WeaponModManager; +import com.hbm.util.InventoryUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; @@ -152,8 +153,33 @@ public class ContainerWeaponTable extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - return null; + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack copy = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + copy = stack.copy(); + + if(index < 8) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 8, this.inventorySlots.size(), true)) return null; + slot.onPickupFromSlot(player, stack); + } else { + if(stack.getItem() instanceof ItemGunBaseNT) { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 7, 8, false)) return null; + } else { + if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 7, false)) return null; + } + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return copy; } public class ModSlot extends Slot { @@ -171,12 +197,14 @@ public class ContainerWeaponTable extends Container { public void putStack(ItemStack stack) { super.putStack(stack); refreshInstalledMods(); + WeaponModManager.onInstallStack(gun.getStackInSlot(0), stack, index); } @Override public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { super.onPickupFromSlot(player, stack); refreshInstalledMods(); + WeaponModManager.onUninstallStack(gun.getStackInSlot(0), stack, index); } public void refreshInstalledMods() { diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index e1fddc0de..557ee78e3 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -137,6 +137,27 @@ public class AmmoPressRecipes extends SerializableRecipe { null, smokeless.copy(2), null, null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_SP, 8), + null, lead, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_FMJ, 8), + null, steel, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_JHP, 8), + plastic, copper, null, + null, smokeless, null, + null, cSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_AP, 8), + null, wSteel, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.P45_DU, 8), + null, uranium, null, + null, smokeless.copy(2), null, + null, sSmall, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R556_SP, 16), null, lead.copy(2), null, null, smokeless.copy(2), null, diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index ff80ce43c..1d58a9f7f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -158,7 +158,7 @@ public class GunFactory { SILENCER, SCOPE, SAW, GREASEGUN, SLOWDOWN, SPEEDUP, CHOKE, SPEEDLOADER, FURNITURE_GREEN, FURNITURE_BLACK, BAYONET, - STACK_MAG, + STACK_MAG, SKIN_SATURNITE, } public static enum EnumModCaliber { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index 557123942..9658c3cf4 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -920,7 +920,7 @@ public class Orchestras { if(type == AnimType.CYCLE) { if(timer == 0) { - int rounds = WeaponModManager.hasUpgrade(stack, ctx.configIndex, 208) ? 2 : 1; + int rounds = WeaponModManager.hasUpgrade(stack, ctx.configIndex, WeaponModManager.ID_MINIGUN_SPEED) ? 3 : 1; for(int i = 0; i < rounds; i++) { SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, aiming ? 0.125 : 0.5, aiming ? -0.125 : -0.25, aiming ? -0.25 : -0.5D, 0, 0.18, -0.12, 0.01, (float)entity.getRNG().nextGaussian() * 15F, (float)entity.getRNG().nextGaussian() * 15F, casing.getName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java index d9698f42f..fe742a0a3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryEnergy.java @@ -132,9 +132,9 @@ public class XFactoryEnergy { energy_las_ir = new BulletConfig().setItem(EnumAmmo.CAPACITOR_IR).setCasing(new ItemStack(ModItems.ingot_polymer, 2), 4).setupDamageClass(DamageClass.FIRE).setBeam().setSpread(0.0F).setLife(5).setRenderRotations(false).setOnBeamImpact(LAMBDA_IR_HIT); ModItems.gun_tesla_cannon = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() - .dura(2_000).draw(10).inspect(33).reloadSequential(true).crosshair(Crosshair.CIRCLE) + .dura(2_000).draw(10).inspect(33).crosshair(Crosshair.CIRCLE) .rec(new Receiver(0) - .dmg(35F).delay(20).reload(44).jam(19).sound("hbm:weapon.fire.tesla", 1.0F, 1.0F) + .dmg(35F).delay(20).spreadHipfire(1.5F).reload(44).jam(19).sound("hbm:weapon.fire.tesla", 1.0F, 1.0F) .mag(new MagazineBelt().addConfigs(energy_tesla, energy_tesla_overcharge)) .offset(0.75, 0, -0.375).offsetScoped(0.75, 0, -0.25) .setupStandardFire().recoil(LAMBDA_RECOIL_ENERGY)) @@ -143,9 +143,9 @@ public class XFactoryEnergy { ).setUnlocalizedName("gun_tesla_cannon"); ModItems.gun_lasrifle = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() - .dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).scopeTexture(scope_luna) + .dura(2_000).draw(10).inspect(26).crosshair(Crosshair.CIRCLE).scopeTexture(scope_luna) .rec(new Receiver(0) - .dmg(50F).delay(8).reload(44).jam(36).sound("hbm:weapon.fire.laser", 1.0F, 1.0F) + .dmg(50F).delay(8).spreadHipfire(1F).reload(44).jam(36).sound("hbm:weapon.fire.laser", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 24).addConfigs(energy_las, energy_las_overcharge, energy_las_ir)) .offset(0.75, -0.0625 * 1.5, -0.1875) .setupStandardFire().recoil(LAMBDA_RECOIL_ENERGY)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java b/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java index 3dd6c6dc2..a6b959bc7 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/IWeaponMod.java @@ -10,4 +10,7 @@ public interface IWeaponMod { /** The meat and bones of the upgrade eval. Requires the base value, the held gun, the value's * identifier and the yet unmodified parent (i.e. if the value is part of the receiver, that receiver) */ public T eval(T base, ItemStack gun, String key, Object parent); + + public default void onInstall(ItemStack gun, ItemStack mod, int index) { } + public default void onUninstall(ItemStack gun, ItemStack mod, int index) { } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java index 1dbf1a4b0..1794a8cd4 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModCaliber.java @@ -4,10 +4,13 @@ import java.util.ArrayList; import java.util.List; import com.hbm.items.weapon.sedna.BulletConfig; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.Receiver; +import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineBelt; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mags.MagazineSingleReload; +import com.hbm.items.weapon.sedna.mags.MagazineSingleTypeBase; import net.minecraft.item.ItemStack; @@ -46,7 +49,6 @@ public class WeaponModCaliber extends WeaponModBase { return (T) DUMMY_FULL; } if(base instanceof MagazineBelt) { - MagazineBelt original = (MagazineBelt) base; DUMMY_BELT.acceptedBullets = cfg; return (T) DUMMY_BELT; } @@ -56,4 +58,17 @@ public class WeaponModCaliber extends WeaponModBase { } return base; } + + /* adding or removing a caliber mod annihilates the loaded rounds */ + public void onInstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } + public void onUninstall(ItemStack gun, ItemStack mod, int index) { clearMag(gun, index); } + + public void clearMag(ItemStack stack, int index) { + ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); + IMagazine mag = gun.getConfig(stack, index).getReceivers(stack)[0].getMagazine(stack); + if(mag instanceof MagazineSingleTypeBase) { + MagazineSingleTypeBase mstb = (MagazineSingleTypeBase) mag; + mstb.setAmount(stack, 0); + } + } } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index ba9bb3c46..c2fb9d39b 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -127,13 +127,14 @@ public class WeaponModManager { new WeaponModDefinition(EnumModSpecial.GREASEGUN).addMod(ModItems.gun_greasegun, new WeaponModGreasegun(ID_GREASEGUN_CLEAN)); new WeaponModDefinition(EnumModSpecial.SLOWDOWN).addMod(ModItems.gun_minigun, new WeaponModSlowdown(207)); new WeaponModDefinition(EnumModSpecial.SPEEDUP) - .addMod(ModItems.gun_minigun, new WeaponModMinigunSpeedup(208)) + .addMod(ModItems.gun_minigun, new WeaponModMinigunSpeedup(ID_MINIGUN_SPEED)) .addMod(new Item[] {ModItems.gun_autoshotgun, ModItems.gun_autoshotgun_shredder}, new WeaponModShredderSpeedup(209)); new WeaponModDefinition(EnumModSpecial.CHOKE).addMod(new Item[] {ModItems.gun_pepperbox, ModItems.gun_maresleg, ModItems.gun_double_barrel, ModItems.gun_liberator, ModItems.gun_spas12}, new WeaponModChoke(210)); new WeaponModDefinition(EnumModSpecial.FURNITURE_GREEN).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_GREEN)); new WeaponModDefinition(EnumModSpecial.FURNITURE_BLACK).addMod(ModItems.gun_g3, new WeaponModPolymerFurniture(ID_FURNITURE_BLACK)); new WeaponModDefinition(EnumModSpecial.BAYONET).addMod(ModItems.gun_mas36, new WeaponModMASBayonet(ID_MAS_BAYONET)); new WeaponModDefinition(EnumModSpecial.STACK_MAG).addMod(new Item[] {ModItems.gun_greasegun, ModItems.gun_uzi, ModItems.gun_uzi_akimbo, ModItems.gun_aberrator, ModItems.gun_aberrator_eott}, new WeaponModStackMag(214)); + new WeaponModDefinition(EnumModSpecial.SKIN_SATURNITE).addMod(new Item[] {ModItems.gun_uzi, ModItems.gun_uzi_akimbo}, new WeaponModUziSaturnite(ID_UZI_SATURN)); BulletConfig[] p9 = new BulletConfig[] {XFactory9mm.p9_sp, XFactory9mm.p9_fmj, XFactory9mm.p9_jhp, XFactory9mm.p9_ap}; BulletConfig[] p45 = new BulletConfig[] {XFactory45.p45_sp, XFactory45.p45_fmj, XFactory45.p45_jhp, XFactory45.p45_ap, XFactory45.p45_du}; @@ -178,9 +179,11 @@ public class WeaponModManager { public static final int ID_NO_SHIELD = 204; public static final int ID_NO_STOCK = 205; public static final int ID_GREASEGUN_CLEAN = 206; + public static final int ID_MINIGUN_SPEED = 208; public static final int ID_FURNITURE_GREEN = 211; public static final int ID_FURNITURE_BLACK = 212; public static final int ID_MAS_BAYONET = 213; + public static final int ID_UZI_SATURN = 215; public static ItemStack[] getUpgradeItems(ItemStack stack, int cfg) { if(!stack.hasTagCompound()) return new ItemStack[0]; @@ -240,12 +243,28 @@ public class WeaponModManager { } } - public static boolean isApplicable(ItemStack gun, ItemStack mod, int cfg, boolean checkMutex) { - if(gun == null || mod == null) return false; //if either stacks are null + public static void onInstallStack(ItemStack gun, ItemStack mod, int cfg) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); + if(newMod == null) return; + newMod.onInstall(gun, mod, cfg); + } + + public static void onUninstallStack(ItemStack gun, ItemStack mod, int cfg) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); + if(newMod == null) return; + newMod.onUninstall(gun, mod, cfg); + } + + public static IWeaponMod modFromStack(ItemStack gun, ItemStack mod, int cfg) { + if(gun == null || mod == null) return null; WeaponModDefinition def = stackToMod.get(new ComparableStack(mod)); - if(def == null) return false; //if the mod stack doesn't have a mod definition - IWeaponMod newMod = def.modByGun.get(new ComparableStack(gun)); - if(newMod == null) newMod = def.modByGun.get(null); //if there's no per-gun mod, default to null key + if(def == null) return null; + IWeaponMod newMod = def.modByGun.get(new ComparableStack(gun).makeSingular()); //shift clicking causes the gun to have stack size 0! + return newMod; + } + + public static boolean isApplicable(ItemStack gun, ItemStack mod, int cfg, boolean checkMutex) { + IWeaponMod newMod = modFromStack(gun, mod, cfg); if(newMod == null) return false; //if there's just no mod applicable if(checkMutex) for(int i : gun.stackTagCompound.getIntArray(KEY_MOD_LIST + cfg)) { diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java new file mode 100644 index 000000000..baba38d00 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModUziSaturnite.java @@ -0,0 +1,22 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.GunConfig; +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModUziSaturnite extends WeaponModBase { + + public WeaponModUziSaturnite(int id) { + super(id, "FURNITURE"); + this.setPriority(PRIORITY_ADDITIVE); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == GunConfig.F_DURABILITY) return cast((Float) base * 5F, base); + if(key == Receiver.F_BASEDAMAGE) return cast((Float) base + 3F, base); + return base; + } + +} diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 1f3c3dd08..6f56ba605 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -958,6 +958,7 @@ public class ResourceManager { public static final ResourceLocation flamethrower_daybreaker_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/flamethrower_daybreaker.png"); public static final ResourceLocation mike_hawk_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lag.png"); public static final ResourceLocation uzi_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi.png"); + public static final ResourceLocation uzi_saturnite_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/uzi_saturnite.png"); public static final ResourceLocation panzerschreck_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/panzerschreck.png"); public static final ResourceLocation g3_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3.png"); public static final ResourceLocation g3_green_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/g3_polymer_green.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java index 4752e9443..1fdea82b0 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUzi.java @@ -35,7 +35,7 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { public void renderFirstPerson(ItemStack stack) { ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem(); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); double scale = 0.25D; GL11.glScaled(scale, scale, scale); @@ -143,7 +143,7 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -159,14 +159,14 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { boolean silenced = hasSilencer(stack, 0); - if(silenced) { + if(silenced && type == ItemRenderType.INVENTORY) { double scale = 0.625D; GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -179,4 +179,8 @@ public class ItemRenderUzi extends ItemRenderWeaponBase { public boolean hasSilencer(ItemStack stack, int cfg) { return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); } + + public boolean isSaturnite(ItemStack stack) { + return WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_UZI_SATURN); + } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java index 68ab84b23..ec538663b 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderUziAkimbo.java @@ -36,10 +36,10 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { float offset = 0.8F; for(int i = -1; i <= 1; i += 2) { - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + int index = i == -1 ? 0 : 1; + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, index) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); GL11.glPushMatrix(); - int index = i == -1 ? 0 : 1; standardAimingTransform(stack, -2.25F * offset * i, -1.5F * offset, 2.5F * offset, 0, -4.375 / 8D, 1); double scale = 0.25D; @@ -156,7 +156,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderEquipped(ItemStack stack) { GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 1) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -170,7 +170,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderEquippedAkimbo(ItemStack stack) { GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 0) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("GunMirror"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -185,7 +185,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, index) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart(index == 0 ? "GunMirror" : "Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -199,7 +199,6 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public void renderOther(ItemStack stack, ItemRenderType type) { GL11.glEnable(GL11.GL_LIGHTING); GL11.glShadeModel(GL11.GL_SMOOTH); - Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.uzi_tex); boolean silencer0 = hasSilencer(stack, 1); boolean silencer1 = hasSilencer(stack, 0); @@ -216,6 +215,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 1) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("Gun"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -238,6 +238,7 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { GL11.glScaled(scale, scale, scale); GL11.glTranslated(0, 0, -4); } + Minecraft.getMinecraft().renderEngine.bindTexture(isSaturnite(stack, 0) ? ResourceManager.uzi_saturnite_tex : ResourceManager.uzi_tex); ResourceManager.uzi.renderPart("GunMirror"); ResourceManager.uzi.renderPart("StockBack"); ResourceManager.uzi.renderPart("StockFront"); @@ -252,4 +253,8 @@ public class ItemRenderUziAkimbo extends ItemRenderWeaponBase { public boolean hasSilencer(ItemStack stack, int cfg) { return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_SILENCER); } + + public boolean isSaturnite(ItemStack stack, int cfg) { + return WeaponModManager.hasUpgrade(stack, cfg, WeaponModManager.ID_UZI_SATURN); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java index 896112e17..1dac5081a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java @@ -191,7 +191,7 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme /// For when opening from a player's inventory. public static void spawnSpiders(EntityPlayer player, World worldObj, ItemStack crate) { - if(crate.getTagCompound().getBoolean("spiders")) { + if(crate.hasTagCompound() && crate.getTagCompound().getBoolean("spiders")) { Random random = new Random(); for (int i = 0; i < numSpiders; i++) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 8d8a8a260..577bbd545 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3697,6 +3697,14 @@ item.wd40.name=VT-40 item.weapon_bat.name=Richards Standard item.weapon_bat_nail.name=Das Klischee item.weapon_golf_club.name=Schläger des russischen Mafiosos +item.weapon_mod_caliber.bmg50.name=.50 BMG Konversionskit +item.weapon_mod_caliber.m357.name=.357 Magnum Konversionskit +item.weapon_mod_caliber.m44.name=.44 Magnum Konversionskit +item.weapon_mod_caliber.p22.name=.22 lfB Konversionskit +item.weapon_mod_caliber.p45.name=.45 Konversionskit +item.weapon_mod_caliber.p9.name=9mm Konversionskit +item.weapon_mod_caliber.r556.name=5.56mm Konversionskit +item.weapon_mod_caliber.r762.name=7.62mm Konversionskit item.weapon_mod_generic.bigmt_damage.name=Optimierter Saturnit-Verschluss item.weapon_mod_generic.bigmt_dura.name=Langlebige Saturnit-Teile item.weapon_mod_generic.bronze_damage.name=Optimierter Bronzeverschluss @@ -3723,6 +3731,7 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernisierungskit item.weapon_mod_special.saw.name=Bügelsäge item.weapon_mod_special.scope.name=Ziehlvorrichtung item.weapon_mod_special.silencer.name=Schalldämpfer +item.weapon_mod_special.skin_saturnite.name=Saturnit-Skin item.weapon_mod_special.slowdown.name=Rädergetriebe item.weapon_mod_special.speedloader.name=Schnelllader item.weapon_mod_special.speedup.name=Elektrischer Servomotor diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 9085b8d52..b3bf02dd6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4723,6 +4723,14 @@ item.wd40.name=VT-40 item.weapon_bat.name=Richard's Default item.weapon_bat_nail.name=The Cliché item.weapon_golf_club.name=Russian Mobster's Club +item.weapon_mod_caliber.bmg50.name=.50 BMG Conversion Kit +item.weapon_mod_caliber.m357.name=.357 Magnum Conversion Kit +item.weapon_mod_caliber.m44.name=.44 Magnum Conversion Kit +item.weapon_mod_caliber.p22.name=.22 LR Conversion Kit +item.weapon_mod_caliber.p45.name=.45 Conversion Kit +item.weapon_mod_caliber.p9.name=9mm Conversion Kit +item.weapon_mod_caliber.r556.name=5.56mm Conversion Kit +item.weapon_mod_caliber.r762.name=7.62mm Conversion Kit item.weapon_mod_generic.bigmt_damage.name=Optimized Saturnite Receiver item.weapon_mod_generic.bigmt_dura.name=High-Durability Saturnite Parts item.weapon_mod_generic.bronze_damage.name=Optimized Bronze Receiver @@ -4749,6 +4757,7 @@ item.weapon_mod_special.greasegun.name=Grease Gun Modernization Kit item.weapon_mod_special.saw.name=Hacksaw item.weapon_mod_special.scope.name=Scope item.weapon_mod_special.silencer.name=Silencer +item.weapon_mod_special.skin_saturnite.name=Saturnite Skin item.weapon_mod_special.slowdown.name=Gear Train item.weapon_mod_special.speedloader.name=Speedloader item.weapon_mod_special.speedup.name=Auxiliary Electric Engine diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_sheet.png index 0a9ac00437b62ca1098ec1fae6cec1ce6c99d61c..be0625b8f19cdc5a92ae2a10de6dff8d7b451202 100644 GIT binary patch delta 3298 zcmV<83?1{(81@;EG=Hs0L_t(|ob6muXdK5G{?;6#^x=YJ`GQ2jmpE4Ls6^vp2sB0~ zsg1xWlq2LW7AfHlh@iTE#I0LZotr zQzYBfg;YoGPCDrVY2qeKA5Q;jc5e1|<|NCu;tv*`cK4gz{eQoie`fxFXARa5h7}lZ z!+;7}n8jhgS*6_N>+``25Rb=MJRWCKl0!i}U%L!}PuyDhu~IW&L$@(v1`{Zgu`KW_Uu_TH90;2y!OU1+Qo*3hLp>Q$K$M6EZY9p z;R8S-kuU}Z27jyv92gkT;;#jfNQCwE^#Ldwcw}Tm>DmThH-52LM16fdip3&yM2N@Z z?6o(J;fv)Z0Ki)>4=9&G#^=ushr_JCz8<m zqinxWD8vpQK8)GfSu8IvV}5=f2O8c%+pFKZ^0&}GWPf}BmI&c+SgCo&<8k)vp9k>8 z@)E9oK4Tf5FC&piNXwEL9{|ptJ!=$;MQFK10CRJ5*5>#7!M6xELrgWe+vK%4GkHYOa`S=38hjAfW8Pwc|52=?t?0o|U)pnpH&R~G}EMTo^> zhEoes6@iSuVt9l5ttEo!MpSFEX`03pi*KQ&$A5<#=>?#40Drsige$*7MKTruc)eZ# zQ0@~%E(uA$d68vEBoZtZi%HL^)+fk}53G)g{C>Z6u3MiF3WZo}Yby>kyo1&k9s#`n zz>QBLm^nXf`SfZS>ji7+@uBg4AL@cz@uxRB@yG5nj(ll>wTM8*BW^yQ2LNo_whaKV zeSiCQB@t^C!SDAo-uMK5Xi7r3i69zrts+$8Z;=&Hi#y8a^GGBTESXFiJU^e$!|U}b zyR&NUXy;Gr6<%()y2*K?LT;eGmg@}&X*`XU@U zbjTnP03el089=!O==Lcx5f1IUkA0c{7JocK5ppDmU$zN z_nT;a;SpSZ^9nkL)j|#`B32aua2CM{q6kkv{j_zAhPkQ}yjUz|9NKpuOI`okGJn3z z{iuLMNF)*lb=oQ*BewMTFy3z}8(-u*i^vCts-UZ@i_zBE*~x&FIFbYZ$dMzAcO%5* z&#A_jVQ_y7JGAdUM(#(I@Avzyb9m$HTwmsPbou`|;bVL`>c=|^1Wnl|xC}W-S0g*_=+I0CI*@?%GA7>L26KHR5$Hc@0 zPMkY*?yfKhL5NL;>JyolmS)n?fc zQ5FmaZTr&cw6+MW7-Hl7CKj&&kB^45L?A=z<^qUI!(=kFY@diwD8#zEyRm!sZp_Zk z!Zb~-d_Z@1H}1LT9xN{}Zlo8` zaUzY!M?;uDm)6QHOioT>a({ACI~M?yMXRr`x5^^ptIR*h_^3!0di0M-6%HjAdFChJ%_omMH&ZnV;Y@(d8LX3y1(K*r}$OL~-$$z%Ym1{B>O z4Mk&`wHfxzmMj-wnx-+(Y_f))asaLcWi9|z9$8DF@HfrmMG?d@P17_+Mn){-i%Augd!||M{JAvhf?Lr#kW$YF zkc%M~#3P%{Vrgj!&ph*tYo|;hV_-F8L7{BG*#{HIn3+sQITX%clel8;K|IH)Jl%M{ z3{*yQPtY}#y#-kH{eJ)~pU-d98uIx(g27@7gq_Y=tAOG``E-}d%)1cN~&lS!pcxl}5lSS%uw z$zX174y95_$@m1_C@gibv;lS(6OYGPCX=Z+#|bhKZfZV2=70Nx!635PEP}zHB@o{) zICaXqckgz*F+Mfu2AwFZ=x$`AAUBSPjmigj0Q=|%up2j>P9v2{8PRBz@h<73k3Nz< zK(ScF`M=~)7yJP?(hDeD&!O@D?@_p(!?S1nZuf0NGMTheoFsyq;dtndf<$x~bBhbLcu0CRJ5n3|f>9#WDBD#j<*!@mR|+ouESRARL#)9N;vfcW{U#0wY9Nr+qPM6LM$#WqM@Myi+_uY0ALe9#@B(!4~N67R4T#i z^;V2<_%J$&pmY7PUNF)4x_nVY)(?9uh-!N(m2xZ35vf$l5ECziT57)z$mmYjuch`A zYN`1me+;<_5$~9Mz-Hy&G5LVa%J%>o3kwLO^h)cw-T1Q5gl%?QxfHgKYqEIMcdV0Eo-__N{yk0MASrfp6hMW|7 zpph8hJ_vA1$mr$+rlzKp`5vHLyT8gU;9lQW+kXkP@7U3Ijp36Q4Qd6wPd&!pnvw%iTHcit2 zz`DD;F*P-X69?0HIpAR`!8;F7HuP7yg^GjXKKftWUnmq%C=@FA;y(Icb}q2KBGd{# zA%7EzMA*p4i1jYNTRs2)JGDQJx?oT*A3(L4gy01c-Hl8rs?8(>FNj#vos3UNCX)sQ z^PDnbs@XMN@Hv6z=4P#|81eahK+E2MYXHycgp(IPbFFRFe1D-(aOKNs{tAphL8ROgxH2k-gOC1_0nWyD8-g}AHnNq!(&MUb$aYT}Lx0ru zY5|1xYzeaTWW_{``T`Pyhg%B(Y<)omU$+HV_aw9g-8IZ>0biRJ&rh$ZCDa91k}_ON za9$yE@iRm0nB80yk3ykfh#j+=i>d~GbhJ^%Cs1~);lT!s_nXQsfaf}8);xSZK!$3g zBb9h~wb4;6`2gPd)%YqaadfUP3x6l8@|`kk9rX$;WNs&@bh?zfywLEOHROP zrOn-Zzy|ZjdciulD9PP?z#93HUqk@_r?-tL@jHiwN`E`P-+#OEW$*WgLLoLfI=a5= z1AeTiWqrW-&rNg;qNXS+AWXy_I&q!>z|`;dRuoX}*k*wE%^&_9f0cYdB!3dY&Ye3e z))u(&D@H-zWUe{hWVK_P0le{b-UX#7D)9m6uMeOa{?qL{tluK&*k)}7WPJKciZx?Z zTps{{`FuXS9C*)KTL4tg2Y3MBXTLwlzR6s};?V(6+OXl^z|DT%+Y0;wiyP?$Y1lxe zjImy@h6l^BpVo&{xbaDKzJCV*zWnD=qvfy1ZM9x>H$UCJV-1gYXTUXfBZ=obmI0u- z$DMDvpqUq+GboZN!_14%ZA!NzLM4EvT2`$s2|zilOk1rFb0>qo?eN{@R>q1U#(qe% z?=H78)y{RTd;|gkM%$X6u)e5Kg`*rzzKH!e} gUeIRYi}`^613xi0zUv92djJ3c07*qoM6N<$f*?XV*#H0l delta 3131 zcmV-B48-&H8PFJzG=B$4L_t(|ob6m+Xd6c!{x%qMPbzj~73ZbupZL6-&5 z3Obm>VSl(y+2QN+!3&T~CRs9>WKxnxLp)!*4S`SGM)`?ELjAK#_C zC-BwUDgfY}mq(S`py2c8Mx#;I($WH55fX_63x~r9hr?J}TGA3h?7VueYt?ilc%Kbm&;|T z2&q)ch<`?-QjV?&y}i8*0H&v>8x{e8)00D?5V9{dv5yQG)Z2k-&*fhemY0|DiCdq? zuyB6f$?5elH3Zf%7((!&5Sq>1_{*Dp`18OSPrkIlMns_C5w}z-0RY$ zh<}ZW5DteKAAAD8G$kSYL=c0xQ4#9#cgY%PBpsDXC8X17mdRuco?j}J5C{a6(^yxeZxo$$!sqnO1jjfZkZ3_^oWJ7 z7azstx2~dZT+MP&5wWfSfVT)<5JhDEvAAc2) z2&h$BrGtl`B^Ofa!2+PJfKYFIHvx3{;0Peo!{@_)lquRr2Ef9}lh zw739VH7IHP#b#& zOZ6&|X(E%!C{4X=w?S zN<}I71YH-FCRlm^?i7xLZsl&Ge4~iqLqDK=qlo9ug#A9Z3z$y zVBJprn7LfQ?(S~Z*4E~H6Jlj$1+A^ESXo&C0G9wVzJCrxel!|ol}ZJHK%i!Y!`tX2 zg3k4)hQP$&>+(er*$CWT5cT$KHtW}(C$ibBAr@W;jr4vUP|&@u-$?H#G}7}${uGKe zBHlIifS)V>uBiw7T=`9a#>N5yDZM^=wi{n&O}Ork8@&E)FUQS~mtp{bSggJkE#ph; z0W$pQg?~c~08YH|K|{Ilz<~n{04`m+B;{|!f)?B14ZVH)_936oJBxrjflaLkcwy-2 z$JqU$-T0<>6XPc@Y6q#avy%mbL6pm7%+Jr)@caAwSs)NVBYOgP(2|p^2U>{%{)+&w zf{boGU~Xg8Np!C z#iwJJE?qL_=jRO?1)ZIpOca5?>1t$m43A2s0^WF21@+{`#YI4)CtH?f0AK?H1DKne z!}~Af@N#DpQ!($FfNG$>Dc-DkQ#?km#pC628Rc@hhA$qY*Rpeg%@v_h@CBJzEXF1# zCV!mo^83{T0I*Ysb7(eAy?OxkW)gxIL`*j_p{O^L5WFB_PxlHwA(P1%WafEQ#8j(m zy5MU9d-m+ns)`YxuLpD-?DRG8oJlxy@eAMHRxkIL%Vl4_EceS$ZzOD_LZ$-h$pDI^U=HeHI zI5GRBC?4f<*$^jYzZ6vu{OV|{f={68R_iZYF+E}_j{u(QRatA|>j5&j}dt%B|}_~7e&7k`voRN@0@ zY=6ML4hlZ~N{VyGs<=M@01Jgec)9aKXKw*ezaFpy4z!v2`^#O7*%8Km%(3q;cQNYC zHIrzaHX7yM^Y9Zvr;SGW_dGT#!e)qg&tpe~ZGasSwgJQ-W?yPz-(T)xDw{N9{2dV* z0RK}n%#J7rU*yY0+`^x0xip*kp1=3g0G~u;BVaps!ipe2ztNh&PCa0o@Wpz-{{eWK VDb>MLE7|}6002ovPDHLkV1ni469fPN diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_special.skin_saturnite.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb5e43553273daea9d8988e1d821cf70e7e642b GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfm4_8VZa7>}*dade%&T;l>3_a`(BnGB7BRtc`>J9IR~MIps>fla zd~K={OeYv_ZZOZkmk@fo$yeYcgT?Q&v&|!}J}_mNuC{6ygT6t;roa26UW+WceCz-N YL%6?V6~ng`AP+Hky85}Sb4q9e09x5s*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png b/src/main/resources/assets/hbm/textures/models/weapons/uzi_saturnite.png new file mode 100644 index 0000000000000000000000000000000000000000..5b404a064a9062954e50c786271c4ccab43387e4 GIT binary patch literal 5454 zcma)Ac_36>*q^b}%UD9$Nl0&&8vAYtWu%x?))K}}W69c>Y!N~khB8A@CQFvV*h8`p zS+We-Wd@ZkTfVFJ`~UmyANSlj_uO-y=Q+>s_x#R0v9vJZ;ov zSAm6QvL|!h^F19M$UeShs2Zow)k3@4eAhrQee$GIED{p-QxapW8yd)=EU9bcxoUP< zuDYGIo&Jx|r7vvvGBSKi9FlkuT=~J)R#x`*M^mA>JH_j)ZODQ;q6fKf-{#uzMxzQZ z=yAn{lVV`)pEw)RWrb15?{7IYPSCf@56Tn=J`HWTo?LmrDy8uit2h-&9ON<(>97d4 z^UCgZrJo9s{))CRwwOYmNxe>8pY9JoGHBT$icKH-M$0HP?mNg!{hH5*guoxxcf0TI;lk67Ig1g_N**u$>}PfYue*Kv70w9vh}YMz9-d86ydyTLMEF;VxA@vw zjY;f@>7(m=y>7X@gBo{Q$KFVr+4(X^NP$^5i}3%Fb;L=x*O%6EA8EJHZ|XjWD`l^^ z|5{Yx;V~3Kt6?~isl#!&it5rL^ag*xz%PwTYN?mpwW<0b-cP%Js!?#$+{Ir%f(A4e z8-+UTN`&8@Sw=eq{?-T!yRPKcs_tljy^xD1tBqLMY; zBrE0Csu8&)E4%Y@x+(a<#O#mrvJ=GA3>3xHq{Y>gukQ!E44iZ~6BwCJ9F^8k=bG*u z_LQye)%~-Z)unkSw}@kTb=6z8;l#D0HAOA^se2#Z1|FTzYlv8MlToksnYz+T8{@Aq zkG?zXS7RBQ&O`Ze=Ru9)#{SOy`lAC<_{Hol`dqG{*rMvpd${h`H0e~i1bLkxZLv|V z%Z`~=y!J@m?SKa`Mh2m&i{j+Yna1#o`>S1kk$bzPMn?C4W}6t$?c@4})t8I3O#R$c zvy(Cq0|e`SDXG%hDG>gNtayZamrc9z%)#b{W9RG-;#_G{2vjNue3a#9kv2cnME91& zV`8gcg>TL*ABS~dZ*yMBmBjAl|C@jK!L=1J-bN>PEhQ1-!pA-C;(UXRHeZ;a^{$4R z8k0-hq%##`UeGM_`jR__MPzO+z)0s;-ofFemI)LImJ4i1P*U`%K9;0=ly5m2P!}3x zke(FO5RR(KvW&~JUZ8DcH{7ud5|wWf zzGj^MsE#alp0WRyQzy=bd@Io5k1Ke$xqHp1{K$<}GC##{s?I+G8d5eo*5e3-h)%81 z9VdsJKl^%y?~?)J+t;Ojq$;iox}>;f%AER}&}~+JsP$Y+|U*^Qs}~UgSd;&&u~L#FaxOFT_WUFh{H;90=n* z5op)_^F0*e_xCa;h#)cgn-cOi`+t6W%P-3%+()6TjEuzeBEuKA8~b5ydJ^45vqd|t z=VfwW9=sJFP+590gM$Bgi@al?C~#tIa`HI<$T2GQMQ?BK$7gG{!_8+iiQTa%ITLfk z@d0j0e3XPrF}_!0iAuHK-JbAWIN05=_Yru`rkn#a(ueVrYw89TMKh*pnH6it<`L6ZYx=dG^?f9{J$tvtT04^zQ?!hQD;sf?faKpE4o`*A2f%t7?k z-M6MrTcpd7$Z?GoJC3AA*+=_=fohCg+!V_g{k7Oq{>^fZ3Lo|C4&(`U@3^lKdXVC~ zQli<%OA>%h>HVm&e+w>Yzr`K)1x7EQ);7T4}ZAoEfam%3(5NLdlV8zVdeAcuPOp&+h%)RV#4(1){n5D@Bpgv z0K7ndbt5NYlnseD66xsnxnY01`W=2>-7Ax`pI$qw=}6NqImahqEZPgtTsUUHJEWcl z;ZYMf?2T7el0XgS_S#6Vt$Qw&j<}x-t9aRH-lF&m1kBt^yg})Ox1-}gLkZVmFq{@NYz$-wGu-*+^s;^IxBC~}tBQ>$1~iBWy2?XLW~Vog#p?*hZNfQmBb0Xe)jXPo$vCQ-Z4nk zw-GRaMVO=h$srVLR=!(VA9wl2`F*!|PGwXWP@8>unB%ZBHY)?)543YOR{wKDDca+M;jh+?9jfFz!fgDLpXf*pW)f0N8<-E5!mMR2*Jbo^`pNasmB zONBA((3d2P5QgJ{>WSPG5JzSf*02_buv+|4P|9cTR9pURgu73Q3HqFnXe%gh5=~F6 zo)%gNZmf*1U;}e5EYAjYk7_*SL?KEFaAF3ZbDLCc+Cu#Uq!nN3rEe~qI*90`3-;$; z4c(;wUNY&Ij)(-_h<7ID=U3?IX*TvA9Q=0cw>Uc39U!_i)u+TiJQNzgxvi#~Wj-jE zpn1Fhp>_t9O1)Fc%=ZGM9+NMC<^pOw+~7;5pvz{su6Uq79QpAy=nI{S+85POh;D4B(15mF7uw5RWx!aRY#EMQOJe0x{Lt z<6`SU5ohq=#GA}LeUBRqSRaaSh+J}!4L?r6QMfY0}4_B9_Rph`TFLDv;swjMw83V z%|^3aQ5s<8Zd6bH5`HSB!`UqDbwyz2744>1K#xm<8ekiW3MB>4k%t!`4Ob_(mCnn^ zx5$ru@ldEHELSA|HK5j$C?kJ56#KhqDelP?r}S7q)da)6oK+bS+pscM!Xqc=8LDrwe7 zV_vF*y0U6E6%6w6ss$x#27o3?$Fm>KLUipIMV0}!egADwTlwXDvyw8G5C{|lh)~eU zS#C8;j6XS2srMeB56w#)(&wEV^OD@Z+wf>?9nJeWMh5S@twpj+#GzTZpU*oT&DTc^ z*l;F2^1F(X4Gz-0!64*-uMoXsJD+s=jr)Xa34M95}|5O8W){Jy(AZea# z;`~s<8Myu>E^-(FS_i)U-{@X-q}D0cB<|}5XHKp#;`}K=z(yXgXRn}Diw*Qke8^3a zdit0Y1Cd7#4(})Y=LFD^xH6_kpi3+UZZ#gqVTiSoZ4U1(nG*;5vflxy=;)83`oUGz zr56BWuE|wK#&0XPbqNUezw4f2kw*rcGfV5sP!UV*DN3Wf3;nOm6C84r4bi ziEnwQItZC=``DEpYGG9rT&Ke#8r8Z;ok96$`Jp&DkCB8q^7m!RNa&xWS{F_DWW zz0Jc;ry0pUQ179g`gL!n_QB@xjCK zf3})&YQB$Rp>_<1{{cw7CGM=(-^XRFVJ?CF6bG>L7y#BM|F$H0hwq;dMcQur($R2t zC@85M^}yHHx9|+l?Re9H(L(W~?#{XLQQwOvZrR%MrP^Rw>H9Pd_ZCM}jQuynhi+t>iQi8hjMsGJNZ~-Sj?V-S>ztktFWBae1CgMsypt2nD?%`3G|4 zr7mv?PuH^ilJh=q6$BJ~Pem8>NN%grUYg5%57%9am`FvD^q3Td0Kt%TXmK@lnrh?0OJ`e4CMlcsUsj3YGw%~aMAM`RxV2`_ z5;Z)Bp!oA}b;d}EoUIv^@3DI_$~K~v1D~vczln+xxIjuG4%QR}L!1)}sOEJe24Dj~ zI$aXr2Pw%NzlgO^wmSj(mbS++E};Yl!DfNO9q1rUcei6x?`RAAtKq6(|K#?bFm`@= zYInyNagKFVK zF)ot!qy}{S=SN3h9N$Pijg!HHQ(TD77xKBfEX>>|9rVvL2%$&Qq-XY8yQIwqSAGgk zh091u9ii4)3(1>Js8#IaqPOhGW@m)3T$MG^UM;+DX=4D;vh41ncMEFZ_PMraK4F<(+e7O(+~#PC;-aiu!dSB1do?zs69_6Y zMY<6EtS`=aG-@e*-JUF0+T?E*sZLqB{kjm%6|#K>?^~an(H$FLRU&WW{F#uWHsqxG ZM_h>jnd&Mp@&_a<$jsQnsKn3-^FPj%YEl3I literal 0 HcmV?d00001 From e318c830236c7e794770cc963e39fa6c46d6d0f2 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sun, 23 Mar 2025 00:47:32 +0100 Subject: [PATCH 04/32] =?UTF-8?q?Yes=20i've=20planted=20the=20oil=20rig=20?= =?UTF-8?q?malware=20bob=20=F0=9F=91=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hbm/main/StructureManager.java | 3 ++- .../com/hbm/world/gen/NTMWorldGenerator.java | 11 +++++++++-- .../assets/hbm/structures/AircraftCarrier.nbt | Bin 33262 -> 0 bytes .../assets/hbm/structures/aircraft_carrier.nbt | Bin 0 -> 28330 bytes 4 files changed, 11 insertions(+), 3 deletions(-) delete mode 100644 src/main/resources/assets/hbm/structures/AircraftCarrier.nbt create mode 100644 src/main/resources/assets/hbm/structures/aircraft_carrier.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index f34d7722f..a895048d1 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -56,7 +56,8 @@ public class StructureManager { public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); - public static final NBTStructure aircraft = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/AircraftCarrier.nbt")); + public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); +// public static final NBTStructure oilrig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oilrig.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index b444188d2..da4a7e8fd 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -64,11 +64,18 @@ public class NTMWorldGenerator implements IWorldGenerator { NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = oceanBiomes::contains; - structure = new JigsawPiece("aircraft", StructureManager.aircraft); + structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier); maxHeight = 46; - spawnWeight = 75 * 5; + spawnWeight = 1; }}); +// NBTStructure.registerStructure(0, new SpawnCondition() {{ +// canSpawn = oceanBiomes::contains; +// structure = new JigsawPiece("oilrig", StructureManager.oilrig); +// maxHeight = 56; +// spawnWeight = 5 * 5; +// }}); + Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); }}; diff --git a/src/main/resources/assets/hbm/structures/AircraftCarrier.nbt b/src/main/resources/assets/hbm/structures/AircraftCarrier.nbt deleted file mode 100644 index 3902285e4d994d08f0f0ff4acbf6839a8d01e40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33262 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 JZ{pLB{s*wdFfIT9 diff --git a/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt b/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bd7071830c79bf5170c7a3ec934fe06daa5d6c04 GIT binary patch literal 28330 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 Date: Sun, 23 Mar 2025 13:27:38 +0100 Subject: [PATCH 05/32] Added oil rig. Made all structures rarer (via null spawn weight) --- .../java/com/hbm/main/StructureManager.java | 2 +- .../com/hbm/world/gen/NTMWorldGenerator.java | 17 +++++++++++------ .../hbm/structures/aircraft_carrier.nbt | Bin 28330 -> 28938 bytes .../assets/hbm/structures/oil_rig.nbt | Bin 0 -> 26724 bytes 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/hbm/structures/oil_rig.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index a895048d1..0961156f7 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -57,7 +57,7 @@ public class StructureManager { public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); -// public static final NBTStructure oilrig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oilrig.nbt")); + public static final NBTStructure oil_rig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oil_rig.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index da4a7e8fd..015fcdc66 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -69,12 +69,17 @@ public class NTMWorldGenerator implements IWorldGenerator { spawnWeight = 1; }}); -// NBTStructure.registerStructure(0, new SpawnCondition() {{ -// canSpawn = oceanBiomes::contains; -// structure = new JigsawPiece("oilrig", StructureManager.oilrig); -// maxHeight = 56; -// spawnWeight = 5 * 5; -// }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = oceanBiomes::contains; + structure = new JigsawPiece("oil_rig", StructureManager.oil_rig); + maxHeight = 48; + spawnWeight = 2; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = oceanBiomes::contains; + spawnWeight = 8; + }}); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); diff --git a/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt b/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt index bd7071830c79bf5170c7a3ec934fe06daa5d6c04..5fb37d4bf83116fbe086b958130add216d24b3e4 100644 GIT binary patch literal 28938 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 br}`v>>z(xrm&G?OujTEzl=i2*(3<}NSX$mL literal 28330 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 literal 0 HcmV?d00001 From 7d642f155cd80fc95496a47cbca62e7ae16037d4 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sun, 23 Mar 2025 16:17:16 +0100 Subject: [PATCH 06/32] Fixed retardation code Oilrig building upgraded and made it spawn always on the same Y --- .../com/hbm/world/gen/NTMWorldGenerator.java | 8 +++----- .../assets/hbm/structures/oil_rig.nbt | Bin 26724 -> 28468 bytes 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 015fcdc66..4fc082b95 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -73,13 +73,11 @@ public class NTMWorldGenerator implements IWorldGenerator { canSpawn = oceanBiomes::contains; structure = new JigsawPiece("oil_rig", StructureManager.oil_rig); maxHeight = 48; - spawnWeight = 2; + minHeight = 47; + spawnWeight = 4; }}); - NBTStructure.registerStructure(0, new SpawnCondition() {{ - canSpawn = oceanBiomes::contains; - spawnWeight = 8; - }}); + NBTStructure.registerNullWeight(0, 12); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); diff --git a/src/main/resources/assets/hbm/structures/oil_rig.nbt b/src/main/resources/assets/hbm/structures/oil_rig.nbt index 449d4f10cc546ee9449586608946df8ae4dbddae..6540893a477c76424add14785acad44466f9355c 100644 GIT binary patch literal 28468 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 literal 26724 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 From 9806d53b45c431abaca1f1a21e1ecea02cc0a723 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sun, 23 Mar 2025 16:25:36 +0100 Subject: [PATCH 07/32] forgorred to commit ts --- src/main/java/com/hbm/main/StructureManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 0961156f7..7ca8d62e1 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -58,6 +58,7 @@ public class StructureManager { public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); public static final NBTStructure oil_rig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oil_rig.nbt")); + // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); From 6ceba52f95d73648c17dda0d4d857c34dc8c28bb Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Sun, 23 Mar 2025 18:12:26 +0100 Subject: [PATCH 08/32] Added beached patrol boat --- src/main/java/com/hbm/main/StructureManager.java | 1 + .../com/hbm/world/gen/NTMWorldGenerator.java | 11 ++++++++++- .../assets/hbm/structures/beached_patrol.nbt | Bin 0 -> 9554 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/hbm/structures/beached_patrol.nbt diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 7ca8d62e1..8387ce48c 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -58,6 +58,7 @@ public class StructureManager { public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.nbt")); public static final NBTStructure aircraft_carrier = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/aircraft_carrier.nbt")); public static final NBTStructure oil_rig = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/oil_rig.nbt")); + public static final NBTStructure beached_patrol = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/beached_patrol.nbt")); // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 4fc082b95..9d8f1d5dc 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -37,6 +37,8 @@ public class NTMWorldGenerator implements IWorldGenerator { public NTMWorldGenerator() { final List invalidBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); final List oceanBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean }); + final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); @@ -74,7 +76,14 @@ public class NTMWorldGenerator implements IWorldGenerator { structure = new JigsawPiece("oil_rig", StructureManager.oil_rig); maxHeight = 48; minHeight = 47; - spawnWeight = 4; + spawnWeight = 3; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = beachBiomes::contains; + structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol); + spawnWeight = 8; + maxHeight = 65; }}); NBTStructure.registerNullWeight(0, 12); diff --git a/src/main/resources/assets/hbm/structures/beached_patrol.nbt b/src/main/resources/assets/hbm/structures/beached_patrol.nbt new file mode 100644 index 0000000000000000000000000000000000000000..45e6face82b6979d5605860b194e580c5019626d GIT binary patch literal 9554 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 F{{VP{^Tz-H literal 0 HcmV?d00001 From d6c15c8ff2d5e235a9c32706bc7091288bc4d6e8 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 23 Mar 2025 21:46:56 +0100 Subject: [PATCH 09/32] the malicious gigglefish from the silly dimension --- changelog | 7 ++++- gradle.properties | 2 +- src/main/java/api/hbm/fluid/IFluidUser.java | 0 .../java/com/hbm/crafting/WeaponRecipes.java | 16 +++++++++++ .../inventory/recipes/AmmoPressRecipes.java | 17 ++++++++--- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 19 ++++++++++-- .../weapon/sedna/factory/GunFactory.java | 3 +- .../weapon/sedna/factory/XFactory556mm.java | 2 +- .../weapon/sedna/factory/XFactory9mm.java | 27 +++++++++++++++++- .../weapon/sedna/mods/WeaponModManager.java | 11 ++++++- .../weapon/sedna/mods/WeaponModOverride.java | 22 ++++++++++++++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 10 +++---- .../packet/toclient/GunAnimationPacket.java | 4 +-- .../com/hbm/render/anim/HbmAnimations.java | 8 ++++-- .../weapon/sedna/ItemRenderWeaponBase.java | 10 +++++++ .../machine/storage/TileEntityBarrel.java | 8 +++++- .../storage/TileEntityMachineFluidTank.java | 16 ++++++----- src/main/resources/META-INF/HBM_at.cfg | 2 ++ src/main/resources/assets/hbm/lang/de_DE.lang | 10 +++++++ src/main/resources/assets/hbm/lang/en_US.lang | 10 +++++++ .../items/weapon_mod_test.override_10.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_12_5.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_15.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_20.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_2_5.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_5.png | Bin 0 -> 267 bytes .../items/weapon_mod_test.override_7_5.png | Bin 0 -> 267 bytes 28 files changed, 175 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/api/hbm/fluid/IFluidUser.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png create mode 100644 src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png diff --git a/changelog b/changelog index b970bea8a..7514dcf6c 100644 --- a/changelog +++ b/changelog @@ -44,6 +44,10 @@ * Crates will not longer show their contents when locked * Crates found in structures will sometimes contain things that aren't items * Beam weapons are no longer pinpoint accurate when firing unscoped +* Reduced the recoil animation's intensity on the G3 by 66%, unless if the stock is sawed off +* The comically long pistol no longer cancels the inspect animation when fired while inspecting + * Instead, it will fire where the gun is pointing, at the player's face + * There's no special animation for this, since in survival mode, that would be lethal anyway ## Fixed * Fixed animation errors on the MAS-36 @@ -56,4 +60,5 @@ * Chunk-loading drones may or may not be fixed * Fixed disperser canisters not actually despawning on impact, endlessly spawning mist clouds * Fixed issues where the new packet system didn't play nice with machines that are being sent packets by other machines, like watz segments and radar screens -* Fixed fat man's piston not being extended correctly in non-first person rendering when unloaded \ No newline at end of file +* Fixed fat man's piston not being extended correctly in non-first person rendering when unloaded +* Fixed weapon equip animation not playing when switching between two weapons of the same type diff --git a/gradle.properties b/gradle.properties index 7e329bde9..ca8db7f3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5257 +mod_build_number=5278 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/api/hbm/fluid/IFluidUser.java b/src/main/java/api/hbm/fluid/IFluidUser.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 5ba032b13..6ae2883c3 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -16,6 +16,7 @@ import com.hbm.items.ModItems; import com.hbm.items.weapon.GunB92Cell; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModSpecial; import com.hbm.main.CraftingManager; import net.minecraft.init.Blocks; @@ -96,6 +97,21 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_SHOT, 6), new Object[] { "C", "P", "G", 'C', Blocks.gravel, 'P', Items.paper, 'G', Items.gunpowder }); CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_IRON, 6), new Object[] { "C", "P", "G", 'C', IRON.ingot(), 'P', Items.paper, 'G', Items.gunpowder }); + //SEDNA Mods + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SILENCER.ordinal()), new Object[] { "P", "B", "P", 'P', ANY_PLASTIC.ingot(), 'B', STEEL.lightBarrel() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SCOPE.ordinal()), new Object[] { "SPS", "G G", "SPS", 'P', ANY_PLASTIC.ingot(), 'S', STEEL.plate(), 'G', KEY_ANYPANE }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SAW.ordinal()), new Object[] { "BBS", "BHB", 'B', STEEL.bolt(), 'S', KEY_STICK, 'H', DURA.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SPEEDLOADER.ordinal()), new Object[] { " B ", "BSB", " B ", 'B', STEEL.bolt(), 'S', WEAPONSTEEL.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SLOWDOWN.ordinal()), new Object[] { " I ", " M ", "I I", 'I', WEAPONSTEEL.ingot(), 'M', WEAPONSTEEL.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SPEEDUP.ordinal()), new Object[] { "PIP", "WWW", "PIP", 'P', WEAPONSTEEL.plate(), 'I', GUNMETAL.ingot(), 'W', GOLD.wireDense() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.GREASEGUN.ordinal()), new Object[] { "BRM", "P G", 'B', WEAPONSTEEL.lightBarrel(), 'R', WEAPONSTEEL.lightReceiver(), 'M', WEAPONSTEEL.mechanism(), 'P', DURA.plate(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.CHOKE.ordinal()), new Object[] { "P", "B", "P", 'P', WEAPONSTEEL.plate(), 'B', DURA.lightBarrel() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.FURNITURE_GREEN.ordinal()), new Object[] { "PDS", " G", 'P', ANY_PLASTIC.ingot(), 'D', KEY_GREEN, 'S', ANY_PLASTIC.stock(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.FURNITURE_BLACK.ordinal()), new Object[] { "PDS", " G", 'P', ANY_PLASTIC.ingot(), 'D', KEY_BLACK, 'S', ANY_PLASTIC.stock(), 'G', ANY_PLASTIC.grip() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SKIN_SATURNITE.ordinal()), new Object[] { "BRM", " P ", 'B', BIGMT.lightBarrel(), 'R', BIGMT.lightReceiver(), 'M', BIGMT.mechanism(), 'P', BIGMT.plate() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.STACK_MAG.ordinal()), new Object[] { "P P", "P P", "PMP", 'P', WEAPONSTEEL.plate(), 'M', BIGMT.mechanism() }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.BAYONET.ordinal()), new Object[] { " P", "BBB", 'P', WEAPONSTEEL.plate(), 'B', STEEL.bolt() }); + //Nitra! CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_SP, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M357_SP), ModItems.nitra }); CraftingManager.addShapelessAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_SP, 6), new Object[] { DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.M44_SP), ModItems.nitra }); diff --git a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java index 557ee78e3..de3fd9e09 100644 --- a/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AmmoPressRecipes.java @@ -39,6 +39,7 @@ public class AmmoPressRecipes extends SerializableRecipe { OreDictStack copper = new OreDictStack(CU.ingot()); OreDictStack plastic = new OreDictStack(ANY_PLASTIC.ingot()); OreDictStack uranium = new OreDictStack(U238.ingot()); + OreDictStack ferro = new OreDictStack(FERRO.ingot()); ComparableStack smokeful = new ComparableStack(Items.gunpowder); OreDictStack smokeless = new OreDictStack(ANY_SMOKELESS.dust()); ComparableStack rocket = new ComparableStack(ModItems.rocket_fuel); @@ -195,6 +196,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, uranium.copy(2), null, null, smokeless.copy(4), null, null, sSmall.copy(2), null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.R762_HE, 12), + he, ferro, null, + null, smokeless.copy(4), null, + null, sSmall.copy(2), null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_SP, 12), null, lead.copy(2), null, @@ -216,6 +221,10 @@ public class AmmoPressRecipes extends SerializableRecipe { null, uranium.copy(2), null, null, smokeless.copy(6), null, null, sBig, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.BMG50_HE, 12), + he, ferro, null, + null, smokeless.copy(6), null, + null, sBig, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G12_BP, 6), null, nugget.copy(6), null, @@ -259,21 +268,22 @@ public class AmmoPressRecipes extends SerializableRecipe { null, nugget.copy(8), null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_SHRAPNEL, 4), plastic, nugget.copy(8), null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_DU, 4), null, uranium, null, null, smokeless.copy(2), null, null, sShell, null)); - recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_SLUG, 4), null, lead, null, null, smokeless.copy(2), null, null, sShell, null)); + recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G10_EXPLOSIVE, 4), + he, ferro, null, + null, smokeless.copy(2), null, + null, sShell, null)); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.G26_FLARE, 4), null, rp, null, @@ -387,7 +397,6 @@ public class AmmoPressRecipes extends SerializableRecipe { null, lPlate , null)); OreDictStack tungsten = new OreDictStack(W.ingot()); - OreDictStack ferro = new OreDictStack(FERRO.ingot()); recipes.add(new AmmoPressRecipe(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.COIL_TUNGSTEN, 4), null, null, null, null, tungsten, null, diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index ed086e56e..b0b659935 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -14,7 +14,6 @@ import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.interfaces.IItemHUD; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIWeaponTable; -import com.hbm.items.IEquipReceiver; import com.hbm.items.IKeybindReceiver; import com.hbm.items.weapon.sedna.hud.IHUDComponent; import com.hbm.items.weapon.sedna.mags.IMagazine; @@ -48,7 +47,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; -public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipReceiver, IItemHUD { +public class ItemGunBaseNT extends Item implements IKeybindReceiver, IItemHUD { /** Timestamp for rendering smoke nodes and muzzle flashes */ public long[] lastShot; @@ -96,6 +95,7 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei public static final String KEY_LOCKONTARGET = "lockontarget"; public static final String KEY_LOCKEDON = "lockedon"; public static final String KEY_CANCELRELOAD = "cancel"; + public static final String KEY_EQUIPPED = "eqipped"; public static ConcurrentHashMap loopedSounds = new ConcurrentHashMap(); @@ -228,7 +228,6 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei } } - @Override public void onEquip(EntityPlayer player, ItemStack stack) { for(int i = 0; i < this.configs_DNA.length; i++) { playAnimation(player, stack, AnimType.EQUIP, i); @@ -291,6 +290,17 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei return; } + /// ON EQUIP /// + if(player != null) { + boolean wasHeld = this.getIsEquipped(stack); + + if(!wasHeld && isHeld && player != null) { + this.onEquip(player, stack); + } + } + + this.setIsEquipped(stack, isHeld); + /// RESET WHEN NOT EQUIPPED /// if(!isHeld) { for(int i = 0; i < confNo; i++) { @@ -359,6 +369,9 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei // RELOAD CANCEL // public static boolean getReloadCancel(ItemStack stack) { return getValueBool(stack, KEY_CANCELRELOAD); } public static void setReloadCancel(ItemStack stack, boolean value) { setValueBool(stack, KEY_CANCELRELOAD, value); } + // EQUIPPED // + public static boolean getIsEquipped(ItemStack stack) { return getValueBool(stack, KEY_EQUIPPED); } + public static void setIsEquipped(ItemStack stack, boolean value) { setValueBool(stack, KEY_EQUIPPED, value); } /// UTIL /// diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index 1d58a9f7f..f456c204e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -139,7 +139,8 @@ public class GunFactory { } public static enum EnumModTest { - FIRERATE, DAMAGE, MULTI; + FIRERATE, DAMAGE, MULTI, + OVERRIDE_2_5, OVERRIDE_5, OVERRIDE_7_5, OVERRIDE_10, OVERRIDE_12_5, OVERRIDE_15, OVERRIDE_20; } public static enum EnumModGeneric { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java index 4aafb28ea..d59d23a9e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory556mm.java @@ -111,7 +111,7 @@ public class XFactory556mm { .addBus("EQUIP", new BusAnimationSequence().addPos(45, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL)); case CYCLE: return new BusAnimation() .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 20).addPos(0, 0, -4.5, 40).addPos(0, 0, 0, 40)) - .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, ItemGunBaseNT.getIsAiming(stack) ? -0.5 : -0.75, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_FULL)); + .addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, (ItemGunBaseNT.getIsAiming(stack) || !WeaponModManager.hasUpgrade(stack, 0, WeaponModManager.ID_NO_STOCK)) ? -0.25 : -0.75, 25, IType.SIN_DOWN).addPos(0, 0, 0, 75, IType.SIN_FULL)); case CYCLE_DRY: return new BusAnimation() .addBus("BOLT", new BusAnimationSequence().addPos(0, 0, 0, 250).addPos(0, 0, -0.3125, 100).hold(25).addPos(0, 0, -2.75, 130).hold(50).addPos(0, 0, -2.4375, 50).addPos(0, 0, 0, 85)) .addBus("PLUG", new BusAnimationSequence().addPos(0, 0, 0, 250).hold(125).addPos(0, 0, -2.4375, 130).hold(100).addPos(0, 0, 0, 85)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java index 0cd151888..e8749552f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory9mm.java @@ -15,6 +15,7 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT.GunState; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; +import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.items.weapon.sedna.mags.MagazineFullReload; import com.hbm.items.weapon.sedna.mods.WeaponModManager; import com.hbm.main.MainRegistry; @@ -25,7 +26,10 @@ import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.BusAnimationKeyframe.IType; import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.util.EntityDamageUtil; +import com.hbm.util.DamageResistanceHandler.DamageClass; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; public class XFactory9mm { @@ -64,7 +68,7 @@ public class XFactory9mm { .dmg(25F).delay(4).dry(10).spread(0.005F).reload(53).jam(44).sound("hbm:weapon.fire.pistol", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 17).addConfigs(p9_sp, p9_fmj, p9_jhp, p9_ap)) .offset(1, -0.0625 * 2.5, -0.25D) - .setupStandardFire().recoil(LAMBDA_RECOIL_LAG)) + .setupStandardFire().fire(LAMBDA_FIRE_LAG).recoil(LAMBDA_RECOIL_LAG)) .setupStandardConfiguration() .anim(LAMBDA_LAG_ANIMS).orchestra(Orchestras.ORCHESTRA_LAG) ).setUnlocalizedName("gun_lag"); @@ -133,6 +137,27 @@ public class XFactory9mm { GunStateDecider.deciderAutoRefire(stack, ctx, lastState, 0, index, () -> { return ItemGunBaseNT.getSecondary(stack, index) && ItemGunBaseNT.getMode(stack, ctx.configIndex) == 0; }); }; + public static BiConsumer LAMBDA_FIRE_LAG = (stack, ctx) -> { + AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex); + int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex); + EntityPlayer player = ctx.getPlayer(); + if(player != null && type == AnimType.INSPECT && timer > 20 && timer < 60) { + int index = ctx.configIndex; + Receiver primary = ctx.config.getReceivers(stack)[0]; + IMagazine mag = primary.getMagazine(stack); + BulletConfig config = (BulletConfig) mag.getType(stack, ctx.inventory); + player.addStat(MainRegistry.statBullets, 1); + mag.useUpAmmo(stack, ctx.inventory, 1); + ItemGunBaseNT.setWear(stack, index, Math.min(ItemGunBaseNT.getWear(stack, index) + config.wear, ctx.config.getDurability(stack))); + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, primary.getFireSound(stack), primary.getFireVolume(stack), primary.getFirePitch(stack)); + ItemGunBaseNT.setState(stack, index, GunState.COOLDOWN); + ItemGunBaseNT.setTimer(stack, index, primary.getDelayAfterFire(stack)); + EntityDamageUtil.attackEntityFromNT(player, BulletConfig.getDamage(player, player, DamageClass.PHYSICAL), 1_000F, true, false, 1D, 5F, 0F); + } else { + Lego.doStandardFire(stack, ctx, AnimType.CYCLE, true); + } + }; + public static BiConsumer LAMBDA_SMOKE = (stack, ctx) -> { Lego.handleStandardSmoke(ctx.entity, stack, 2000, 0.05D, 1.1D, ctx.configIndex); }; diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index c2fb9d39b..359936bd2 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -58,6 +58,14 @@ public class WeaponModManager { new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.DAMAGE.ordinal())).addDefault(TEST_DAMAGE); new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.MULTI.ordinal())).addDefault(TEST_MULTI); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_2_5.ordinal())).addDefault(new WeaponModOverride(3, 2.5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_5.ordinal())).addDefault(new WeaponModOverride(4, 5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_7_5.ordinal())).addDefault(new WeaponModOverride(5, 7.5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_10.ordinal())).addDefault(new WeaponModOverride(6, 10F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_12_5.ordinal())).addDefault(new WeaponModOverride(7, 12_5F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_15.ordinal())).addDefault(new WeaponModOverride(8, 15F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_test, 1, EnumModTest.OVERRIDE_20.ordinal())).addDefault(new WeaponModOverride(9, 20F, "OVERRIDE")); + new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DAMAGE.ordinal())).addMod(ModItems.gun_pepperbox, new WeaponModGenericDamage(100)); new WeaponModDefinition(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DURA.ordinal())).addMod(ModItems.gun_pepperbox, new WeaponModGenericDurability(101)); @@ -151,7 +159,7 @@ public class WeaponModManager { .addMod(ModItems.gun_greasegun, new WeaponModCaliber(311, 24, 3F, p45)) .addMod(ModItems.gun_uzi, new WeaponModCaliber(312, 24, 3F, p45)) .addMod(ModItems.gun_uzi_akimbo, new WeaponModCaliber(313, 24, 3F, p45)) - .addMod(ModItems.gun_lag, new WeaponModCaliber(314, 24, 25F, p45)); + .addMod(ModItems.gun_lag, new WeaponModCaliber(314, 15, 25F, p45)); new WeaponModDefinition(EnumModCaliber.P22) .addMod(ModItems.gun_henry, new WeaponModCaliber(320, 28, 10F, p22)) .addMod(ModItems.gun_uzi, new WeaponModCaliber(321, 40, 3F, p22)) @@ -260,6 +268,7 @@ public class WeaponModManager { WeaponModDefinition def = stackToMod.get(new ComparableStack(mod)); if(def == null) return null; IWeaponMod newMod = def.modByGun.get(new ComparableStack(gun).makeSingular()); //shift clicking causes the gun to have stack size 0! + if(newMod == null) newMod = def.modByGun.get(null); return newMod; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java new file mode 100644 index 000000000..54f68163b --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModOverride.java @@ -0,0 +1,22 @@ +package com.hbm.items.weapon.sedna.mods; + +import com.hbm.items.weapon.sedna.Receiver; + +import net.minecraft.item.ItemStack; + +public class WeaponModOverride extends WeaponModBase { + + protected final float baseDamage; + + public WeaponModOverride(int id, float baseDamage, String... slots) { + super(id, slots); + this.baseDamage = baseDamage; + this.setPriority(PRIORITY_SET); + } + + @Override + public T eval(T base, ItemStack gun, String key, Object parent) { + if(key == Receiver.F_BASEDAMAGE) return cast(baseDamage, base); + return base; + } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index d939975a4..c7dd243c2 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5257)"; + public static final String VERSION = "1.0.27 BETA (5278)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 6928ba30b..b726eff94 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -1760,7 +1760,7 @@ public class ClientProxy extends ServerProxy { .addPos(90, 0, 1, 800) .addPos(0, 0, 1, 50)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } /* crucible swing */ @@ -1782,7 +1782,7 @@ public class ClientProxy extends ServerProxy { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:weapon.cSwing"), 0.8F + player.getRNG().nextFloat() * 0.2F)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } } @@ -1806,7 +1806,7 @@ public class ClientProxy extends ServerProxy { .addPos(0, 0, 0, retire)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } else { @@ -1827,7 +1827,7 @@ public class ClientProxy extends ServerProxy { .addPos(2, 0, 2, sideways) .addPos(0, 0, 0, retire)); - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, null); } } @@ -1839,7 +1839,7 @@ public class ClientProxy extends ServerProxy { BusAnimation anim = item.getAnimation(data, stack); if(anim != null) { - HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), anim); + HbmAnimations.hotbar[player.inventory.currentItem][0] = new Animation(player.getHeldItem().getItem().getUnlocalizedName(), System.currentTimeMillis(), anim, null); } } } diff --git a/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java index 922d19200..f72fddb63 100644 --- a/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java +++ b/src/main/java/com/hbm/packet/toclient/GunAnimationPacket.java @@ -105,7 +105,7 @@ public class GunAnimationPacket implements IMessage { if(animation != null) { boolean isReloadAnimation = type == AnimType.RELOAD || type == AnimType.RELOAD_CYCLE || type == AnimType.RELOAD_EMPTY; - HbmAnimations.hotbar[slot][0] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, isReloadAnimation && base.mainConfig.reloadAnimationsSequential); + HbmAnimations.hotbar[slot][0] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, type, isReloadAnimation && base.mainConfig.reloadAnimationsSequential); } } catch(Exception x) { } @@ -143,7 +143,7 @@ public class GunAnimationPacket implements IMessage { Minecraft.getMinecraft().entityRenderer.itemRenderer.resetEquippedProgress(); Minecraft.getMinecraft().entityRenderer.itemRenderer.itemToRender = stack; boolean isReloadAnimation = type == AnimType.RELOAD || type == AnimType.RELOAD_CYCLE || type == AnimType.RELOAD_EMPTY; - HbmAnimations.hotbar[slot][gunIndex] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, isReloadAnimation && config.getReloadAnimSequential(stack)); + HbmAnimations.hotbar[slot][gunIndex] = new Animation(stack.getItem().getUnlocalizedName(), System.currentTimeMillis(), animation, type, isReloadAnimation && config.getReloadAnimSequential(stack)); } } } diff --git a/src/main/java/com/hbm/render/anim/HbmAnimations.java b/src/main/java/com/hbm/render/anim/HbmAnimations.java index e5cc8becd..218042e44 100644 --- a/src/main/java/com/hbm/render/anim/HbmAnimations.java +++ b/src/main/java/com/hbm/render/anim/HbmAnimations.java @@ -47,18 +47,22 @@ public class HbmAnimations { public BusAnimation animation; // If set, don't cancel this animation when the timer ends, instead wait for the next to start public boolean holdLastFrame = false; + // so we know what type of animation we're playing, only used rarely + public AnimType type; - public Animation(String key, long startMillis, BusAnimation animation) { + public Animation(String key, long startMillis, BusAnimation animation, AnimType type) { this.key = key; this.startMillis = startMillis; this.animation = animation; + this.type = type; } - public Animation(String key, long startMillis, BusAnimation animation, boolean holdLastFrame) { + public Animation(String key, long startMillis, BusAnimation animation, AnimType type, boolean holdLastFrame) { this.key = key; this.startMillis = startMillis; this.animation = animation; this.holdLastFrame = holdLastFrame; + this.type = type; } } diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java index 634f50e4a..e365bf670 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderWeaponBase.java @@ -84,6 +84,16 @@ public abstract class ItemRenderWeaponBase implements IItemRenderer { GL11.glPushMatrix(); if(mc.gameSettings.thirdPersonView == 0 && !mc.renderViewEntity.isPlayerSleeping() && !mc.gameSettings.hideGUI && !mc.playerController.enableEverythingIsScrewedUpMode()) { + /*ItemRenderer ir = mc.entityRenderer.itemRenderer; + float equip = ir.prevEquippedProgress + (ir.equippedProgress- ir.prevEquippedProgress) * interp; + Animation current = HbmAnimations.getRelevantAnim(); + // flicker prevention, if equip is in progress, only render if an animation is playing + if(!(equip < 0.25 && ir.prevEquippedProgress < ir.equippedProgress && (current == null || current.type != AnimType.EQUIP))) { + entityRenderer.enableLightmap(interp); + this.setupTransformsAndRender(stack); + entityRenderer.disableLightmap(interp); + }*/ + entityRenderer.enableLightmap(interp); this.setupTransformsAndRender(stack); entityRenderer.disableLightmap(interp); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 88b69a4c1..84db4a9ae 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine.storage; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; import com.hbm.blocks.ModBlocks; @@ -91,7 +92,7 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.unloadTank(4, 5, slots); for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 2) this.trySubscribe(tank.getTankType(), worldObj, pos); + if(mode == 0 || mode == 1) this.trySubscribe(tank.getTankType(), worldObj, pos); if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); } @@ -234,6 +235,11 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom return new FluidTank[] { tank }; } + @Override + public ConnectionPriority getFluidPriority() { + return mode == 1 ? ConnectionPriority.LOW : ConnectionPriority.NORMAL; + } + @Override public int[] getFluidIDToCopy() { return new int[] {tank.getTankType().getID()}; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index 891343625..af722a0d5 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine.storage; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluid.IFluidStandardTransceiver; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; @@ -48,7 +49,7 @@ import java.util.List; import java.util.Random; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiver, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable{ +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiver, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { public FluidTank tank; public short mode = 0; @@ -107,7 +108,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements } for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 2) this.trySubscribe(tank.getTankType(), worldObj, pos); + if(mode == 0 || mode == 1) this.trySubscribe(tank.getTankType(), worldObj, pos); if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); } @@ -331,12 +332,8 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public long getDemand(FluidType type, int pressure) { - - if(this.mode == 2 || this.mode == 3 || this.sendingBrake) - return 0; - + if(this.mode == 2 || this.mode == 3) return 0; if(tank.getPressure() != pressure) return 0; - return type == tank.getTankType() ? tank.getMaxFill() - tank.getFill() : 0; } @@ -377,6 +374,11 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } + @Override + public ConnectionPriority getFluidPriority() { + return mode == 1 ? ConnectionPriority.LOW : ConnectionPriority.NORMAL; + } + @Override public int[] getFluidIDToCopy() { return new int[] {tank.getTankType().getID()}; diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 60e1b0364..28454115f 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -40,6 +40,8 @@ public net.minecraft.nbt.NBTTagList * # Mo # ItemRenderer public net.minecraft.client.renderer.ItemRenderer field_78453_b # itemToRender +public net.minecraft.client.renderer.ItemRenderer field_78454_c # equippedProgress +public net.minecraft.client.renderer.ItemRenderer field_78451_d # prevEquippedProgress # AbstractResourcePack public net.minecraft.client.resources.AbstractResourcePack field_110597_b # resourcePackFile diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 577bbd545..401f3fcaa 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3736,6 +3736,16 @@ item.weapon_mod_special.slowdown.name=Rädergetriebe item.weapon_mod_special.speedloader.name=Schnelllader item.weapon_mod_special.speedup.name=Elektrischer Servomotor item.weapon_mod_special.stack_mag.name=Zweistapel-Magazin +item.weapon_mod_test.damage.name=DAMAGE UPGRADE +item.weapon_mod_test.firerate.name=FIRE RATE UPGRADE +item.weapon_mod_test.multi.name=MULTI SHOT UPGRADE +item.weapon_mod_test.override_2_5.name=DAMAGE OVERRIDE (2.5) +item.weapon_mod_test.override_5.name=DAMAGE OVERRIDE (5) +item.weapon_mod_test.override_7_5.name=DAMAGE OVERRIDE (7.5) +item.weapon_mod_test.override_10.name=DAMAGE OVERRIDE (10) +item.weapon_mod_test.override_12_5.name=DAMAGE OVERRIDE (12.5) +item.weapon_mod_test.override_15.name=DAMAGE OVERRIDE (15) +item.weapon_mod_test.override_20.name=DAMAGE OVERRIDE (20) item.weapon_pipe_lead.name=Die Handüberbrückung item.weapon_pipe_rusty.name=Der Einstellungskorrigierer item.weapon_saw.name=Ärztlich autorisierter Mord diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index b3bf02dd6..ad23fa440 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -4762,6 +4762,16 @@ item.weapon_mod_special.slowdown.name=Gear Train item.weapon_mod_special.speedloader.name=Speedloader item.weapon_mod_special.speedup.name=Auxiliary Electric Engine item.weapon_mod_special.stack_mag.name=Double-Stacked Magazine +item.weapon_mod_test.damage.name=DAMAGE UPGRADE +item.weapon_mod_test.firerate.name=FIRE RATE UPGRADE +item.weapon_mod_test.multi.name=MULTI SHOT UPGRADE +item.weapon_mod_test.override_2_5.name=DAMAGE OVERRIDE (2.5) +item.weapon_mod_test.override_5.name=DAMAGE OVERRIDE (5) +item.weapon_mod_test.override_7_5.name=DAMAGE OVERRIDE (7.5) +item.weapon_mod_test.override_10.name=DAMAGE OVERRIDE (10) +item.weapon_mod_test.override_12_5.name=DAMAGE OVERRIDE (12.5) +item.weapon_mod_test.override_15.name=DAMAGE OVERRIDE (15) +item.weapon_mod_test.override_20.name=DAMAGE OVERRIDE (20) item.weapon_pipe_lead.name=The Manual Override item.weapon_pipe_rusty.name=The Attitude Adjuster item.weapon_saw.name=Doctor Assisted Homicide diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_10.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_12_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_15.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_20.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png b/src/main/resources/assets/hbm/textures/items/weapon_mod_test.override_7_5.png new file mode 100644 index 0000000000000000000000000000000000000000..9866eb14f183f3775b4b4ff3027cd00122c95ad4 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZ;Vn)8is{iL<6HMdmEO0K=< znCp~rZo1d?;;cJtf!!YK+Rp7)SvQY4jAO!i>osL5ddwUe9TNYSiLY(<`^2*8eKpWG N44$rjF6*2UngEn*Xn+6! literal 0 HcmV?d00001 From 6db42e6d4b2d2cb963a8231469776955f55dc41c Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 11:49:53 +1100 Subject: [PATCH 10/32] fix fluid valves not deactivating (was clearing power net rather than fluid net connections) --- .../tileentity/network/TileEntityFluidValve.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java index 823dfdb32..a54caa173 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityFluidValve.java @@ -1,26 +1,27 @@ package com.hbm.tileentity.network; -import api.hbm.energymk2.Nodespace; +import com.hbm.uninos.UniNodespace; + import net.minecraft.block.Block; import net.minecraft.world.World; public class TileEntityFluidValve extends TileEntityPipeBaseNT { - + @Override public boolean shouldCreateNode() { return this.getBlockMetadata() == 1; } public void updateState() { - + this.blockMetadata = -1; // delete cache - + if(this.getBlockMetadata() == 0 && this.node != null) { - Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, this.getType().getNetworkProvider()); this.node = null; } } - + @Override public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { return oldBlock != newBlock; From f00f2c7ca381981889195aee686835ffa8ebfc00 Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 12:25:06 +1100 Subject: [PATCH 11/32] fix compat shim incorrectly subscribing receiving tanks --- .../java/api/hbm/fluid/IFluidStandardReceiver.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java index 196d8a490..364d3353a 100644 --- a/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java +++ b/src/main/java/api/hbm/fluid/IFluidStandardReceiver.java @@ -11,22 +11,22 @@ import net.minecraftforge.common.util.ForgeDirection; @Deprecated public interface IFluidStandardReceiver extends IFluidStandardReceiverMK2 { - + public default void subscribeToAllAround(FluidType type, TileEntity tile) { subscribeToAllAround(type, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); } - + public default void subscribeToAllAround(FluidType type, World world, int x, int y, int z) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - trySubscribe(type, world, x, y, z, dir); + trySubscribe(type, world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir); } } - + public default void tryUnsubscribe(FluidType type, World world, int x, int y, int z) { GenNode node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider()); if(node != null && node.net != null) node.net.removeReceiver(this); } - + public default void unsubscribeToAllAround(FluidType type, TileEntity tile) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { tryUnsubscribe(type, tile.getWorldObj(), tile.xCoord + dir.offsetX, tile.yCoord + dir.offsetY, tile.zCoord + dir.offsetZ); From 62485c6854726adf331e63f46e03ad318c688970 Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 15:05:56 +1100 Subject: [PATCH 12/32] fluid tank handling updated to match energy storage blocks, allowing for more consistent tank leveling behaviour --- .../fluidmk2/IFluidBufferTransceiverMK2.java | 5 + .../hbm/fluidmk2/IFluidStandardSenderMK2.java | 24 +-- .../machine/storage/TileEntityBarrel.java | 65 +++++++- .../storage/TileEntityMachineFluidTank.java | 154 ++++++++++++------ 4 files changed, 179 insertions(+), 69 deletions(-) create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java diff --git a/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java new file mode 100644 index 000000000..7d0ba5d53 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java @@ -0,0 +1,5 @@ +package api.hbm.fluidmk2; + +public interface IFluidBufferTransceiverMK2 extends IFluidStandardTransceiverMK2 { + +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java index 2a1a3ce43..5cbbf4e58 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java @@ -24,29 +24,29 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { public default void tryProvide(FluidTank tank, World world, DirPos pos) { tryProvide(tank.getTankType(), tank.getPressure(), world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } public default void tryProvide(FluidType type, World world, DirPos pos) { tryProvide(type, 0, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } public default void tryProvide(FluidType type, int pressure, World world, DirPos pos) { tryProvide(type, pressure, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - + public default void tryProvide(FluidTank tank, World world, int x, int y, int z, ForgeDirection dir) { tryProvide(tank.getTankType(), tank.getPressure(), world, x, y, z, dir); } public default void tryProvide(FluidType type, World world, int x, int y, int z, ForgeDirection dir) { tryProvide(type, 0, world, x, y, z, dir); } - + public default void tryProvide(FluidType type, int pressure, World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = Compat.getTileStandard(world, x, y, z); boolean red = false; - + if(te instanceof IFluidConnectorMK2) { IFluidConnectorMK2 con = (IFluidConnectorMK2) te; if(con.canConnect(type, dir.getOpposite())) { - + GenNode node = UniNodespace.getNode(world, x, y, z, type.getNetworkProvider()); - + if(node != null && node.net != null) { node.net.addProvider(this); red = true; } } } - - if(te instanceof IFluidReceiverMK2 && te != this) { + + if(te != this && te instanceof IFluidReceiverMK2 && !(te instanceof IFluidBufferTransceiverMK2)) { IFluidReceiverMK2 rec = (IFluidReceiverMK2) te; if(rec.canConnect(type, dir.getOpposite())) { long provides = Math.min(this.getFluidAvailable(type, pressure), this.getProviderSpeed(type, pressure)); @@ -56,7 +56,7 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { this.useUpFluid(type, pressure, toTransfer); } } - + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); @@ -71,9 +71,9 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); } } - + public FluidTank[] getSendingTanks(); - + @Override public default long getFluidAvailable(FluidType type, int pressure) { long amount = 0; @@ -112,14 +112,14 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { public default int[] getProvidingPressureRange(FluidType type) { int lowest = HIGHEST_VALID_PRESSURE; int highest = 0; - + for(FluidTank tank : getSendingTanks()) { if(tank.getTankType() == type) { if(tank.getPressure() < lowest) lowest = tank.getPressure(); if(tank.getPressure() > highest) highest = tank.getPressure(); } } - + return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE; } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 84db4a9ae..101843c50 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -1,7 +1,10 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; -import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; +import api.hbm.fluidmk2.FluidNode; +import api.hbm.fluidmk2.IFluidBufferTransceiverMK2; + +import java.util.HashSet; import com.hbm.blocks.ModBlocks; import com.hbm.handler.CompatHandler; @@ -20,6 +23,8 @@ import com.hbm.tileentity.IFluidCopiable; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.uninos.UniNodespace; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -37,9 +42,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { +public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidBufferTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { + + protected FluidNode node; + protected FluidType lastType; public FluidTank tank; public short mode = 0; @@ -90,10 +99,28 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.setType(0, 1, slots); tank.loadTank(2, 3, slots); tank.unloadTank(4, 5, slots); - - for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 1) this.trySubscribe(tank.getTankType(), worldObj, pos); - if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); + } + } + + if(mode == 2 || mode == 1) { + this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); + } else { + if(node != null && node.hasValidNet()) node.net.removeProvider(this); + } + + if(mode == 0 || mode == 1) { + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(node != null && node.hasValidNet()) node.net.removeReceiver(this); } if(tank.getFill() > 0) { @@ -104,6 +131,30 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom } } + protected FluidNode createNode(FluidType type) { + DirPos[] conPos = getConPos(); + + HashSet posSet = new HashSet<>(); + posSet.add(new BlockPos(this)); + for(DirPos pos : conPos) { + ForgeDirection dir = pos.getDir(); + posSet.add(new BlockPos(pos.getX() - dir.offsetX, pos.getY() - dir.offsetY, pos.getZ() - dir.offsetZ)); + } + + return new FluidNode(type.getNetworkProvider(), posSet.toArray(new BlockPos[posSet.size()])).setConnections(conPos); + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + } + } + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -220,6 +271,8 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.writeToNBT(nbt, "tank"); } + @Override public boolean canConnect(FluidType fluid, ForgeDirection dir) { return true; } + @Override public FluidTank[] getSendingTanks() { return (mode == 1 || mode == 2) ? new FluidTank[] {tank} : new FluidTank[0]; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index af722a0d5..a4272cfc1 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -1,7 +1,9 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; -import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.fluidmk2.FluidNode; +import api.hbm.fluidmk2.IFluidBufferTransceiverMK2; + import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.explosion.vanillant.ExplosionVNT; @@ -22,8 +24,10 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.*; +import com.hbm.uninos.UniNodespace; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.util.ParticleUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -45,23 +49,26 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Random; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiver, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { - +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidBufferTransceiverMK2, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { + + protected FluidNode node; + protected FluidType lastType; + public FluidTank tank; public short mode = 0; public static final short modes = 4; public boolean hasExploded = false; - protected boolean sendingBrake = false; public boolean onFire = false; public byte lastRedstone = 0; public Explosion lastExplosion = null; - + public int age = 0; - + public TileEntityMachineFluidTank() { super(6); tank = new FluidTank(Fluids.NONE, 256000); @@ -82,7 +89,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - + //meta below 12 means that it's an old multiblock configuration if(this.getBlockMetadata() < 12) { //get old direction @@ -98,24 +105,43 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements worldObj.getTileEntity(xCoord, yCoord, zCoord).readFromNBT(data); return; } - + if(!hasExploded) { age++; - + if(age >= 20) { age = 0; this.markChanged(); } - - for(DirPos pos : getConPos()) { - if(mode == 0 || mode == 1) this.trySubscribe(tank.getTankType(), worldObj, pos); - if(mode == 1 || mode == 2) this.tryProvide(tank, worldObj, pos); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); + } } - + + if(mode == 2 || mode == 1) { + this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); + } else { + if(node != null && node.hasValidNet()) node.net.removeProvider(this); + } + + if(mode == 0 || mode == 1) { + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(node != null && node.hasValidNet()) node.net.removeReceiver(this); + } + tank.loadTank(2, 3, slots); tank.setType(0, 1, slots); - } else { - for(DirPos pos : getConPos()) this.tryUnsubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ()); + } else if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; } byte comp = this.getComparatorPower(); //comparator shit @@ -131,11 +157,11 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.explode(); this.tank.setFill(0); } - + if(tank.getTankType().hasTrait(FT_Corrosive.class) && tank.getTankType().getTrait(FT_Corrosive.class).isHighlyCorrosive()) { this.explode(); } - + if(this.hasExploded) { int leaking = 0; @@ -146,26 +172,50 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements } else { leaking = Math.min(tank.getFill(), tank.getMaxFill() / 10000); } - + updateLeak(leaking); } } - + tank.unloadTank(4, 5, slots); - + this.networkPackNT(150); } - + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); ForgeDirection rot = dir.getRotation(ForgeDirection.UP); List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 2.875, zCoord + 1).offset(dir.offsetX * 0.5 - rot.offsetX * 2.25, 0, dir.offsetZ * 0.5 - rot.offsetZ * 2.25)); - + for(EntityPlayer player : players) { HbmPlayerProps props = HbmPlayerProps.getData(player); props.isOnLadder = true; } } + protected FluidNode createNode(FluidType type) { + DirPos[] conPos = getConPos(); + + HashSet posSet = new HashSet<>(); + posSet.add(new BlockPos(this)); + for(DirPos pos : conPos) { + ForgeDirection dir = pos.getDir(); + posSet.add(new BlockPos(pos.getX() - dir.offsetX, pos.getY() - dir.offsetY, pos.getZ() - dir.offsetZ)); + } + + return new FluidNode(type.getNetworkProvider(), posSet.toArray(new BlockPos[posSet.size()])).setConnections(conPos); + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + } + } + } + @Override public void serialize(ByteBuf buf) { super.serialize(buf); @@ -173,7 +223,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements buf.writeBoolean(hasExploded); tank.serialize(buf); } - + @Override public void deserialize(ByteBuf buf) { super.deserialize(buf); @@ -181,39 +231,39 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements hasExploded = buf.readBoolean(); tank.deserialize(buf); } - + /** called when the tank breaks due to hazardous materials or external force, can be used to quickly void part of the tank or spawn a mushroom cloud */ public void explode() { this.hasExploded = true; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.markChanged(); } - + /** called every tick post explosion, used for leaking fluid and spawning particles */ public void updateLeak(int amount) { if(!hasExploded) return; if(amount <= 0) return; - + this.tank.getTankType().onFluidRelease(this, tank, amount); this.tank.setFill(Math.max(0, this.tank.getFill() - amount)); - + FluidType type = tank.getTankType(); - + if(type.hasTrait(FT_Amat.class)) { new ExplosionVNT(worldObj, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F).makeAmat().setBlockAllocator(null).setBlockProcessor(null).explode(); - + } else if(type.hasTrait(FT_Flammable.class) && onFire) { List affected = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 1.5, yCoord, zCoord - 1.5, xCoord + 2.5, yCoord + 5, zCoord + 2.5)); for(Entity e : affected) e.setFire(5); Random rand = worldObj.rand; ParticleUtil.spawnGasFlame(worldObj, xCoord + rand.nextDouble(), yCoord + 0.5 + rand.nextDouble(), zCoord + rand.nextDouble(), rand.nextGaussian() * 0.2, 0.1, rand.nextGaussian() * 0.2); - + if(worldObj.getTotalWorldTime() % 5 == 0) { FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.BURN, amount * 5); } - + } else if(type.hasTrait(FT_Gaseous.class) || type.hasTrait(FT_Gaseous_ART.class)) { - + if(worldObj.getTotalWorldTime() % 5 == 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); @@ -233,7 +283,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void explode(World world, int x, int y, int z) { - + if(this.hasExploded) return; this.onFire = tank.getTankType().hasTrait(FT_Flammable.class); this.hasExploded = true; @@ -243,7 +293,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public void tryExtinguish(World world, int x, int y, int z, EnumExtinguishType type) { if(!this.hasExploded || !this.onFire) return; - + if(type == EnumExtinguishType.WATER) { if(tank.getTankType().hasTrait(FT_Liquid.class)) { // extinguishing oil with water is a terrible idea! worldObj.newExplosion(null, xCoord + 0.5, yCoord + 1.5, zCoord + 0.5, 5F, true, true); @@ -253,13 +303,13 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements return; } } - + if(type == EnumExtinguishType.FOAM || type == EnumExtinguishType.CO2) { this.onFire = false; this.markChanged(); } } - + protected DirPos[] getConPos() { return new DirPos[] { new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), @@ -272,17 +322,17 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) }; } - + public void handleButtonPacket(int value, int meta) { mode = (short) ((mode + 1) % modes); this.markChanged(); } - + AxisAlignedBB bb = null; - + @Override public AxisAlignedBB getRenderBoundingBox() { - + if(bb == null) { bb = AxisAlignedBB.getBoundingBox( xCoord - 2, @@ -293,30 +343,30 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements zCoord + 3 ); } - + return bb; } - + @Override @SideOnly(Side.CLIENT) public double getMaxRenderDistanceSquared() { return 65536.0D; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - + mode = nbt.getShort("mode"); tank.readFromNBT(nbt, "tank"); hasExploded = nbt.getBoolean("exploded"); onFire = nbt.getBoolean("onFire"); } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setShort("mode", mode); tank.writeToNBT(nbt, "tank"); nbt.setBoolean("exploded", hasExploded); @@ -362,6 +412,8 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.onFire = data.getBoolean("onFire"); } + @Override public boolean canConnect(FluidType fluid, ForgeDirection dir) { return true; } + @Override public FluidTank[] getSendingTanks() { if(this.hasExploded) return new FluidTank[0]; @@ -370,7 +422,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements @Override public FluidTank[] getReceivingTanks() { - if(this.hasExploded || this.sendingBrake) return new FluidTank[0]; + if(this.hasExploded) return new FluidTank[0]; return (mode == 0 || mode == 1) ? new FluidTank[] {tank} : new FluidTank[0]; } @@ -404,14 +456,14 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements public boolean isDamaged() { return this.hasExploded; } - + List repair = new ArrayList<>(); @Override public List getRepairMaterials() { - + if(!repair.isEmpty()) return repair; - + repair.add(new OreDictStack(OreDictManager.STEEL.plate(), 6)); return repair; } From 141e80bfcb1fc201f3313f24c8f25f9a6ffb285a Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 16:09:56 +1100 Subject: [PATCH 13/32] batteries and fluid tanks now block propagation if not set to buffer mode (which the player can circumvent by cabling/piping around them, which gives them the choice of behaviour, and is more intuitive) --- .../fluidmk2/IFluidBufferTransceiverMK2.java | 5 - .../hbm/fluidmk2/IFluidStandardSenderMK2.java | 2 +- .../machine/storage/TileEntityBarrel.java | 48 ++++--- .../storage/TileEntityMachineBattery.java | 135 ++++++++++-------- .../storage/TileEntityMachineFluidTank.java | 48 ++++--- 5 files changed, 139 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java diff --git a/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java deleted file mode 100644 index 7d0ba5d53..000000000 --- a/src/main/java/api/hbm/fluidmk2/IFluidBufferTransceiverMK2.java +++ /dev/null @@ -1,5 +0,0 @@ -package api.hbm.fluidmk2; - -public interface IFluidBufferTransceiverMK2 extends IFluidStandardTransceiverMK2 { - -} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java index 5cbbf4e58..75791b659 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java @@ -46,7 +46,7 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 { } } - if(te != this && te instanceof IFluidReceiverMK2 && !(te instanceof IFluidBufferTransceiverMK2)) { + if(te != this && te instanceof IFluidReceiverMK2) { IFluidReceiverMK2 rec = (IFluidReceiverMK2) te; if(rec.canConnect(type, dir.getOpposite())) { long provides = Math.min(this.getFluidAvailable(type, pressure), this.getProviderSpeed(type, pressure)); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index 101843c50..a6a8d4b80 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -2,7 +2,7 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluidmk2.FluidNode; -import api.hbm.fluidmk2.IFluidBufferTransceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; import java.util.HashSet; @@ -45,10 +45,9 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidBufferTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { +public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { protected FluidNode node; - protected FluidType lastType; public FluidTank tank; public short mode = 0; @@ -100,27 +99,42 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom tank.loadTank(2, 3, slots); tank.unloadTank(4, 5, slots); - if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + // In buffer mode, acts like a pipe block, providing fluid to its own node + // otherwise, it is a regular providing/receiving machine, blocking further propagation + if(mode == 1) { + if(this.node == null || this.node.expired) { - this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); - if(this.node == null || this.node.expired || tank.getTankType() != lastType) { - this.node = this.createNode(tank.getTankType()); - UniNodespace.createNode(worldObj, this.node); - lastType = tank.getTankType(); + if(this.node == null || this.node.expired) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + } } - } - if(mode == 2 || mode == 1) { this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - } else { - if(node != null && node.hasValidNet()) node.net.removeProvider(this); - } - - if(mode == 0 || mode == 1) { if(node != null && node.hasValidNet()) node.net.addReceiver(this); } else { - if(node != null && node.hasValidNet()) node.net.removeReceiver(this); + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; + } + + for(DirPos pos : getConPos()) { + FluidNode dirNode = (FluidNode) UniNodespace.getNode(worldObj, pos.getX(), pos.getY(), pos.getZ(), tank.getTankType().getNetworkProvider()); + + if(mode == 2) { + tryProvide(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == 0) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } + } } if(tank.getFill() > 0) { diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 543e7205f..8b038ff38 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -16,6 +16,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.uninos.UniNodespace; import com.hbm.util.CompatEnergyControl; import cpw.mods.fml.common.Optional; @@ -36,14 +37,14 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyConductorMK2, IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, SimpleComponent, IGUIProvider, IInfoProviderEC, CompatHandler.OCComponent { - + public long[] log = new long[20]; public long delta = 0; public long power = 0; public long prevPowerState = 0; - + protected PowerNode node; - + //0: input only //1: buffer //2: output only @@ -55,16 +56,16 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public short redLow = 0; public short redHigh = 2; public ConnectionPriority priority = ConnectionPriority.LOW; - + //public boolean conducts = false; public byte lastRedstone = 0; - + private static final int[] slots_top = new int[] {0}; private static final int[] slots_bottom = new int[] {0, 1}; private static final int[] slots_side = new int[] {1}; - + private String customName; - + public TileEntityMachineBattery() { super(2); slots = new ItemStack[2]; @@ -84,24 +85,24 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public boolean hasCustomInventoryName() { return this.customName != null && this.customName.length() > 0; } - + public void setCustomName(String name) { this.customName = name; } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { - + switch(i) { case 0: case 1: if(stack.getItem() instanceof IBatteryItem) return true; break; } - + return true; } - + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -112,18 +113,18 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I this.lastRedstone = nbt.getByte("lastRedstone"); this.priority = ConnectionPriority.values()[nbt.getByte("priority")]; } - + @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setLong("power", power); nbt.setShort("redLow", redLow); nbt.setShort("redHigh", redHigh); nbt.setByte("lastRedstone", lastRedstone); nbt.setByte("priority", (byte)this.priority.ordinal()); } - + @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); @@ -136,7 +137,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public boolean canExtractItem(int i, ItemStack itemStack, int j) { - + if(itemStack.getItem() instanceof IBatteryItem) { if(i == 0 && ((IBatteryItem)itemStack.getItem()).getCharge(itemStack) == 0) { return true; @@ -145,79 +146,95 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I return true; } } - + return false; } public long getPowerRemainingScaled(long i) { return (power * i) / this.getMaxPower(); } - + public byte getComparatorPower() { if(power == 0) return 0; double frac = (double) this.power / (double) this.getMaxPower() * 15D; return (byte) (MathHelper.clamp_int((int) frac + 1, 0, 15)); //to combat eventual rounding errors with the FEnSU's stupid maxPower } - + @Override public void updateEntity() { - + if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { - + if(priority == null || priority.ordinal() == 0 || priority.ordinal() == 4) { priority = ConnectionPriority.LOW; } - + int mode = this.getRelevantMode(false); - - if(this.node == null || this.node.expired) { - - this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); - + + long prevPower = this.power; + + power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); + + // In buffer mode, becomes a cable block and provides power to itself + // otherwise, acts like a regular power providing/accepting machine + if(mode == mode_buffer) { if(this.node == null || this.node.expired) { - this.node = this.createNode(); - Nodespace.createNode(worldObj, this.node); + + this.node = (PowerNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + UniNodespace.createNode(worldObj, this.node); + } + } + + this.tryProvide(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + this.node = null; + } + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + PowerNode dirNode = (PowerNode) UniNodespace.getNode(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, Nodespace.THE_POWER_PROVIDER); + + if(mode == mode_output) { + tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == mode_input) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } } } - - long prevPower = this.power; - - power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - - if(mode == mode_output || mode == mode_buffer) { - this.tryProvide(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - } else { - if(node != null && node.hasValidNet()) node.net.removeProvider(this); - } - + byte comp = this.getComparatorPower(); if(comp != this.lastRedstone) this.markDirty(); this.lastRedstone = comp; - - if(mode == mode_input || mode == mode_buffer) { - if(node != null && node.hasValidNet()) node.net.addReceiver(this); - } else { - if(node != null && node.hasValidNet()) node.net.removeReceiver(this); - } - + power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); long avg = (power + prevPower) / 2; this.delta = avg - this.log[0]; - + for(int i = 1; i < this.log.length; i++) { this.log[i - 1] = this.log[i]; } - + this.log[19] = avg; - + prevPowerState = power; - + this.networkPackNT(20); } } - + public void onNodeDestroyedCallback() { this.node = null; } @@ -225,10 +242,10 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I @Override public void invalidate() { super.invalidate(); - + if(!worldObj.isRemote) { if(this.node != null) { - Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); } } } @@ -237,7 +254,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I int mode = this.getRelevantMode(true); return mode == mode_output || mode == mode_buffer ? this.getMaxPower() / 600 : 0; } - + @Override public long getReceiverSpeed() { int mode = this.getRelevantMode(true); return mode == mode_input || mode == mode_buffer ? this.getMaxPower() / 200 : 0; @@ -269,30 +286,30 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public long getPower() { return power; } - + private short modeCache = 0; public short getRelevantMode(boolean useCache) { if(useCache) return this.modeCache; this.modeCache = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) ? this.redHigh : this.redLow; return this.modeCache; } - + private long bufferedMax; @Override public long getMaxPower() { - + if(bufferedMax == 0) { bufferedMax = ((MachineBattery)worldObj.getBlock(xCoord, yCoord, zCoord)).maxPower; } - + return bufferedMax; } @Override public boolean canConnect(ForgeDirection dir) { return true; } @Override public void setPower(long power) { this.power = power; } @Override public ConnectionPriority getPriority() { return this.priority; } - + // do some opencomputer stuff @Override @Optional.Method(modid = "OpenComputers") diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index a4272cfc1..c63fefddc 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -2,7 +2,7 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.fluidmk2.FluidNode; -import api.hbm.fluidmk2.IFluidBufferTransceiverMK2; +import api.hbm.fluidmk2.IFluidStandardTransceiverMK2; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; @@ -54,10 +54,9 @@ import java.util.List; import java.util.Random; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidBufferTransceiverMK2, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { +public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { protected FluidNode node; - protected FluidType lastType; public FluidTank tank; public short mode = 0; @@ -114,27 +113,42 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.markChanged(); } - if(this.node == null || this.node.expired || tank.getTankType() != lastType) { + // In buffer mode, acts like a pipe block, providing fluid to its own node + // otherwise, it is a regular providing/receiving machine, blocking further propagation + if(mode == 1) { + if(this.node == null || this.node.expired) { - this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); - if(this.node == null || this.node.expired || tank.getTankType() != lastType) { - this.node = this.createNode(tank.getTankType()); - UniNodespace.createNode(worldObj, this.node); - lastType = tank.getTankType(); + if(this.node == null || this.node.expired) { + this.node = this.createNode(tank.getTankType()); + UniNodespace.createNode(worldObj, this.node); + } } - } - if(mode == 2 || mode == 1) { this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - } else { - if(node != null && node.hasValidNet()) node.net.removeProvider(this); - } - - if(mode == 0 || mode == 1) { if(node != null && node.hasValidNet()) node.net.addReceiver(this); } else { - if(node != null && node.hasValidNet()) node.net.removeReceiver(this); + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); + this.node = null; + } + + for(DirPos pos : getConPos()) { + FluidNode dirNode = (FluidNode) UniNodespace.getNode(worldObj, pos.getX(), pos.getY(), pos.getZ(), tank.getTankType().getNetworkProvider()); + + if(mode == 2) { + tryProvide(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeProvider(this); + } + + if(mode == 0) { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.addReceiver(this); + } else { + if(dirNode != null && dirNode.hasValidNet()) dirNode.net.removeReceiver(this); + } + } } tank.loadTank(2, 3, slots); From b5d76afb8c0e7f9a842675e014e9156f78252cf8 Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 19:56:04 +1100 Subject: [PATCH 14/32] fix switching barrel types not updating fluid net --- .../tileentity/machine/storage/TileEntityBarrel.java | 12 ++++++++---- .../machine/storage/TileEntityMachineFluidTank.java | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java index a6a8d4b80..a383f491a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBarrel.java @@ -48,6 +48,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityBarrel extends TileEntityMachineBase implements SimpleComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IGUIProvider, CompatHandler.OCComponent, IFluidCopiable { protected FluidNode node; + protected FluidType lastType; public FluidTank tank; public short mode = 0; @@ -102,18 +103,21 @@ public class TileEntityBarrel extends TileEntityMachineBase implements SimpleCom // In buffer mode, acts like a pipe block, providing fluid to its own node // otherwise, it is a regular providing/receiving machine, blocking further propagation if(mode == 1) { - if(this.node == null || this.node.expired) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); - if(this.node == null || this.node.expired) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { this.node = this.createNode(tank.getTankType()); UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); } } - this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - if(node != null && node.hasValidNet()) node.net.addReceiver(this); + if(node != null && node.hasValidNet()) { + node.net.addProvider(this); + node.net.addReceiver(this); + } } else { if(this.node != null) { UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index c63fefddc..ff27156ca 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -57,6 +57,7 @@ import java.util.Random; public class TileEntityMachineFluidTank extends TileEntityMachineBase implements SimpleComponent, OCComponent, IFluidStandardTransceiverMK2, IPersistentNBT, IOverpressurable, IGUIProvider, IRepairable, IFluidCopiable { protected FluidNode node; + protected FluidType lastType; public FluidTank tank; public short mode = 0; @@ -116,18 +117,21 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements // In buffer mode, acts like a pipe block, providing fluid to its own node // otherwise, it is a regular providing/receiving machine, blocking further propagation if(mode == 1) { - if(this.node == null || this.node.expired) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); if(this.node == null || this.node.expired) { this.node = this.createNode(tank.getTankType()); UniNodespace.createNode(worldObj, this.node); + lastType = tank.getTankType(); } } - this.tryProvide(tank, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN); - if(node != null && node.hasValidNet()) node.net.addReceiver(this); + if(node != null && node.hasValidNet()) { + node.net.addProvider(this); + node.net.addReceiver(this); + } } else { if(this.node != null) { UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); From 177e5a245efab35fae21f6b329eab82fbe220c7f Mon Sep 17 00:00:00 2001 From: George Paton Date: Mon, 24 Mar 2025 20:00:01 +1100 Subject: [PATCH 15/32] dingleberry blues --- .../tileentity/machine/storage/TileEntityMachineFluidTank.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java index ff27156ca..cf6e8dccc 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFluidTank.java @@ -121,7 +121,7 @@ public class TileEntityMachineFluidTank extends TileEntityMachineBase implements this.node = (FluidNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, tank.getTankType().getNetworkProvider()); - if(this.node == null || this.node.expired) { + if(this.node == null || this.node.expired || tank.getTankType() != lastType) { this.node = this.createNode(tank.getTankType()); UniNodespace.createNode(worldObj, this.node); lastType = tank.getTankType(); From 7146e20fb3c408f920f00c94db14fb963231915a Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 24 Mar 2025 10:38:15 +0100 Subject: [PATCH 16/32] f u c k --- changelog | 67 ++----------------- .../java/api/hbm/fluidmk2/FluidNetMK2.java | 6 +- .../java/com/hbm/crafting/WeaponRecipes.java | 2 +- .../container/ContainerWeaponTable.java | 2 +- src/main/java/com/hbm/util/BobMathUtil.java | 10 +++ 5 files changed, 23 insertions(+), 64 deletions(-) diff --git a/changelog b/changelog index 7514dcf6c..82529db34 100644 --- a/changelog +++ b/changelog @@ -1,64 +1,9 @@ -## Added -* `/ntmserver` - * Functions like `/ntmclient` but for common settings - * Can toggle `DAMAGE_COMPATIBILITY_MODE`, off by default, enables a more compatible (but slightly jankier) version of the bullet damage code - * `MINE__DAMAGE` can be used to adjust landmine damage - * `TAINT_TRAILS` now replaces the hardcore taint config option, making taint blocks more potent and the potion effect trail taint blocks -* New ammo types - * Explosive 7.62mm - * Explosive .50 BMG - * Explosive 10 gauge buckshot (unlike 12 gauge which has explosive slugs) -* Lincoln's repeater, a b-side to the lever action rifle -* Weapon modification table - * All weapon tiers have generic upgrades for increasing damage and durability - * Many guns have specialized attachments. Some examples: - * The assault rifle can use silencers, scopes, can have its stock removed and has two different polymer furnitures - * .44 revolvers can use scopes - * All full-length shotguns can have their barrel sawed off - * Most shotguns can make use of a choke to decrease projectile spread (does not work with sawed-offs) - * The grease gun has a modernization package, replacing most parts and increasing most stats - * Some guns have special mod combos that will change the name - ## Changed -* Fat mines now use the standardized mini nuke code - * Fat mines now have a base damage of exactly 100, being identical to demolition mini nukes - * Fat mines now gib affected entities -* IV bags now use `setHealth` operations instead of dealing damage, preventing health duplication by just avoiding the damage -* The settings tool can now copy and paste the "paint" from paintable cables and fluid ducts -* Changed the way taint works - * Instead of neon purple vines, taint is bow a greyish sludge - * Taint now actively replaces blocks instead of growing along them - * Taint is still limited in spread, however taint spread is lower underground, taint decays three times faster in intensity if the block is not exposed to air, making taint spread more along the surface - * Taint has a 25% chance of splashing down when replacing a block with no supports, causing structures to collapse and taint to spread faster - * Similar to soil sand, entities will sink in taint and get slowed down - * The sludge consumeth -* `enableGuns` config option now applies to SEDNA system guns, simply canceling all gun-related keybinds -* Cinnabar dust, if registered by another mod, can now be acidized into cinnabar using hydrogen peroxide -* Copper wires, like AA and gold, can now be welded into dense wires -* Removed the crafting recipe for the small geothermal generator and ZPE generators -* Removed the gemothermal, ZPE and ambient radiation generators from the creative menu -* Disabled the horrid flicker on the quad rocket launcher's antenna, making steered mode look less terrible -* All non-legendary .357 revolvers now fire a quarter of a second faster -* Changed the detonator's recipe to be less archaic -* Crates can now be opened when held -* Crates will not longer show their contents when locked -* Crates found in structures will sometimes contain things that aren't items -* Beam weapons are no longer pinpoint accurate when firing unscoped -* Reduced the recoil animation's intensity on the G3 by 66%, unless if the stock is sawed off -* The comically long pistol no longer cancels the inspect animation when fired while inspecting - * Instead, it will fire where the gun is pointing, at the player's face - * There's no special animation for this, since in survival mode, that would be lethal anyway +* The toolbox' functionality has been completely changed (thanks gamma) + * Instead of a crappy backpack substitute that doesn't work half the time, the toolbox can quickly swap out the hotbar when used +* Updated StG 77 recipe to use two grips and a proper scope ## Fixed -* Fixed animation errors on the MAS-36 -* Fixed drone docks, requester and provider crates not dropping their contents when broken -* Fixed all missing texture errors that appear in the startup log -* Potentially fixed a crash with mekanism during the recipe change phase -* Removed the coke to heavy oil recipe for allowing infinite oil loops - * Coke to syngas and coalgas recipes should be fine though, so they stay -* Potentially fixed another issue regarding NPCs firing belt-fed guns -* Chunk-loading drones may or may not be fixed -* Fixed disperser canisters not actually despawning on impact, endlessly spawning mist clouds -* Fixed issues where the new packet system didn't play nice with machines that are being sent packets by other machines, like watz segments and radar screens -* Fixed fat man's piston not being extended correctly in non-first person rendering when unloaded -* Fixed weapon equip animation not playing when switching between two weapons of the same type +* Fixed a bunch of singleblocks not accepting fluids (thanks mellow) +* Fixed fluid valves not properly disconnecting +* Fixed a dupe regarding the weapon mod table diff --git a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java index 411f91a77..3283c6489 100644 --- a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java +++ b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java @@ -88,9 +88,11 @@ public class FluidNetMK2 extends NodeNet= 0; i--) { - long toTransfer = Math.min(fluidDemand[p][i], fluidAvailable[p]); + long toTransfer = Math.min(fluidDemand[p][i], totalAvailable); if(toTransfer <= 0) continue; long priorityDemand = fluidDemand[p][i]; @@ -102,6 +104,8 @@ public class FluidNetMK2 extends NodeNet largest) largest = num; return largest; } + public static long min(long... nums) { + long smallest = Long.MAX_VALUE; + for(long num : nums) if(num < smallest) smallest = num; + return smallest; + } + public static long max(long... nums) { + long largest = Long.MIN_VALUE; + for(long num : nums) if(num > largest) largest = num; + return largest; + } public static float min(float... nums) { float smallest = Float.MAX_VALUE; for(float num : nums) if(num < smallest) smallest = num; From 79d3b0cbb7073ace8117ce583f2d8e64fcdd2ae0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 24 Mar 2025 16:01:13 +0100 Subject: [PATCH 17/32] the infinite agony generator --- changelog | 3 +++ gradle.properties | 2 +- .../java/com/hbm/crafting/WeaponRecipes.java | 19 ++++++++++++++++++ .../java/com/hbm/inventory/material/Mats.java | 4 ++-- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 2 +- .../com/hbm/util/DamageResistanceHandler.java | 8 ++++---- .../assets/hbm/textures/items/ducttape.png | Bin 383 -> 344 bytes 8 files changed, 31 insertions(+), 9 deletions(-) diff --git a/changelog b/changelog index 82529db34..a9ca40d00 100644 --- a/changelog +++ b/changelog @@ -2,6 +2,9 @@ * The toolbox' functionality has been completely changed (thanks gamma) * Instead of a crappy backpack substitute that doesn't work half the time, the toolbox can quickly swap out the hotbar when used * Updated StG 77 recipe to use two grips and a proper scope +* Buffed the RPA set +* Tiered damage and durability weapon mods are now craftable +* Duct tape is now cheaper and less ugly ## Fixed * Fixed a bunch of singleblocks not accepting fluids (thanks mellow) diff --git a/gradle.properties b/gradle.properties index ca8db7f3d..f2f5fe3b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5278 +mod_build_number=5279 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index e77df9b63..49c31e360 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -16,6 +16,7 @@ import com.hbm.items.ModItems; import com.hbm.items.weapon.GunB92Cell; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret; +import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModGeneric; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumModSpecial; import com.hbm.main.CraftingManager; @@ -98,6 +99,24 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.STONE_IRON, 6), new Object[] { "C", "P", "G", 'C', IRON.ingot(), 'P', Items.paper, 'G', Items.gunpowder }); //SEDNA Mods + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DAMAGE.ordinal()), new Object[] { GUNMETAL.ingot(), IRON.ingot(), IRON.ingot(), IRON.ingot(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.IRON_DURA.ordinal()), new Object[] { GUNMETAL.ingot(), IRON.ingot(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.STEEL_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), STEEL.plateCast(), STEEL.plateCast(), STEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.STEEL_DURA.ordinal()), new Object[] { GUNMETAL.plate(), STEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DURA_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), DURA.plateCast(), DURA.plateCast(), DURA.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DURA_DURA.ordinal()), new Object[] { GUNMETAL.plate(), DURA.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DESH_DAMAGE.ordinal()), new Object[] { GUNMETAL.mechanism(), DESH.plateCast(), DESH.plateCast(), DESH.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.DESH_DURA.ordinal()), new Object[] { GUNMETAL.plate(), DESH.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.WSTEEL_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), WEAPONSTEEL.plateCast(), WEAPONSTEEL.plateCast(), WEAPONSTEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.WSTEEL_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), WEAPONSTEEL.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.FERRO_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), FERRO.plateCast(), FERRO.plateCast(), FERRO.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.FERRO_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), FERRO.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.TCALLOY_DAMAGE.ordinal()), new Object[] { WEAPONSTEEL.mechanism(), ANY_RESISTANTALLOY.plateCast(), ANY_RESISTANTALLOY.plateCast(), ANY_RESISTANTALLOY.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.TCALLOY_DURA.ordinal()), new Object[] { WEAPONSTEEL.plate(), ANY_RESISTANTALLOY.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BIGMT_DAMAGE.ordinal()), new Object[] { BIGMT.mechanism(), BIGMT.plateCast(), BIGMT.plateCast(), BIGMT.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BIGMT_DURA.ordinal()), new Object[] { BIGMT.plate(), BIGMT.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BRONZE_DAMAGE.ordinal()), new Object[] { BIGMT.mechanism(), ANY_BISMOIDBRONZE.plateCast(), ANY_BISMOIDBRONZE.plateCast(), ANY_BISMOIDBRONZE.plateCast(), ModItems.ducttape }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.weapon_mod_generic, 1, EnumModGeneric.BRONZE_DURA.ordinal()), new Object[] { BIGMT.plate(), ANY_BISMOIDBRONZE.plateCast(), ModItems.ducttape }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SILENCER.ordinal()), new Object[] { "P", "B", "P", 'P', ANY_PLASTIC.ingot(), 'B', STEEL.lightBarrel() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SCOPE.ordinal()), new Object[] { "SPS", "G G", "SPS", 'P', ANY_PLASTIC.ingot(), 'S', STEEL.plate(), 'G', KEY_ANYPANE }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.weapon_mod_special, 1, EnumModSpecial.SAW.ordinal()), new Object[] { "BBS", "BHB", 'B', STEEL.bolt(), 'S', KEY_STICK, 'H', DURA.plate() }); diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index d95b7c51f..16bc6378b 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -138,7 +138,7 @@ public class Mats { public static final NTMMaterial MAT_STEEL = makeSmeltable(_AS + 0, STEEL, 0xAFAFAF, 0x0F0F0F, 0x4A4A4A).setAutogen(DUSTTINY, BOLT, WIRE, DUST, PLATE, CASTPLATE, WELDEDPLATE, SHELL, PIPE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, GRIP).m(); public static final NTMMaterial MAT_MINGRADE = makeSmeltable(_AS + 1, MINGRADE, 0xFFBA7D, 0xAF1700, 0xE44C0F).setAutogen(WIRE, DUST, BLOCK).m(); public static final NTMMaterial MAT_ALLOY = makeSmeltable(_AS + 2, ALLOY, 0xFF8330, 0x700000, 0xFF7318).setAutogen(WIRE, DUST, DENSEWIRE, PLATE, CASTPLATE, BLOCK, HEAVY_COMPONENT).m(); - public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x183039, 0x030B0B, 0x376373).setAutogen(BOLT, DUST, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); + public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x183039, 0x030B0B, 0x376373).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xCCCCEA, 0x11111A, 0xA5A5D3).setAutogen(DUST, DENSEWIRE, BLOCK).m(); public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(HEAVYBARREL, HEAVYRECEIVER).m(); @@ -154,7 +154,7 @@ public class Mats { public static final NTMMaterial MAT_SLAG = makeSmeltable(_AS + 11, SLAG, 0x554940, 0x34281F, 0x6C6562).setAutogen(BLOCK).n(); public static final NTMMaterial MAT_MUD = makeSmeltable(_AS + 14, MUD, 0xBCB5A9, 0x481213, 0x96783B).n(); public static final NTMMaterial MAT_GUNMETAL = makeSmeltable(_AS + 19, GUNMETAL, 0xFFEF3F, 0xAD3600, 0xF9C62C).setAutogen(LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); - public static final NTMMaterial MAT_WEAPONSTEEL = makeSmeltable(_AS + 20, WEAPONSTEEL, 0xA0A0A0, 0x000000, 0x808080).setAutogen(SHELL, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); + public static final NTMMaterial MAT_WEAPONSTEEL = makeSmeltable(_AS + 20, WEAPONSTEEL, 0xA0A0A0, 0x000000, 0x808080).setAutogen(CASTPLATE, SHELL, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).n(); public static final NTMMaterial MAT_SATURN = makeSmeltable(_AS + 4, BIGMT, 0x3AC4DA, 0x09282C, 0x30A4B7).setAutogen(PLATE, CASTPLATE, SHELL, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, MECHANISM, STOCK, GRIP).m(); //Extension diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index c7dd243c2..317faa8d6 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5278)"; + public static final String VERSION = "1.0.27 BETA (5279)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index d5de9f424..ff321331f 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -212,7 +212,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.cbt_device, 1), new Object[] { STEEL.bolt(), ModItems.wrench }); addShapelessAuto(new ItemStack(ModItems.toothpicks, 3), new Object[] { KEY_STICK, KEY_STICK, KEY_STICK }); - addRecipeAuto(new ItemStack(ModItems.ducttape, 6), new Object[] { "FSF", "SPS", "FSF", 'F', Items.string, 'S', KEY_SLIME, 'P', Items.paper }); + addRecipeAuto(new ItemStack(ModItems.ducttape, 4), new Object[] { "F", "P", "S", 'F', Items.string, 'S', KEY_SLIME, 'P', Items.paper }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_sender, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', NETHERQUARTZ.gem() }); addRecipeAuto(new ItemStack(ModBlocks.radio_torch_receiver, 4), new Object[] { "G", "R", "I", 'G', "dustGlowstone", 'R', Blocks.redstone_torch, 'I', IRON.ingot() }); diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index c54bb7a0b..1075f264f 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -111,12 +111,12 @@ public class DamageResistanceHandler { .addExact(DamageSource.fall.damageType, 0F, 1F) .setOther(0F, 0.15F)); registerSet(ModItems.rpa_helmet, ModItems.rpa_plate, ModItems.rpa_legs, ModItems.rpa_boots, new ResistanceStats() - .addCategory(CATEGORY_PROJECTILE, 20F, 0.65F) - .addCategory(CATEGORY_FIRE, 10F, 0.75F) + .addCategory(CATEGORY_PROJECTILE, 25F, 0.65F) + .addCategory(CATEGORY_FIRE, 10F, 0.9F) .addCategory(CATEGORY_EXPLOSION, 15F, 0.25F) - .addExact(DamageClass.LASER.name(), 10F, 0.75F) + .addExact(DamageClass.LASER.name(), 25F, 0.75F) .addExact(DamageSource.fall.damageType, 0F, 1F) - .setOther(10F, 0.15F)); + .setOther(15F, 0.3F)); ResistanceStats bj = new ResistanceStats() .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 2.5F, 0.5F) diff --git a/src/main/resources/assets/hbm/textures/items/ducttape.png b/src/main/resources/assets/hbm/textures/items/ducttape.png index facce7f8eec13c3c420d50e24de5ca82b4feed14..dca05429ab768c805d6bb0e8cee9eb20854c18d5 100644 GIT binary patch delta 301 zcmV+|0n+~e0@wnOG=C3CL_t(IjbmV-5HJ!_(6*}ezmc60oPS`$L57Zu4!AxRVr-EV zm%=GWlmX9QKBLTlN0%QHZ$R6s*8j--dzbDp++(=Mz`(%3U}kTQ-vIOgTQg-1gOZ*S z0|NsC!>4zj88$E7%%E+djopB@RjvQMLw(>9lWQk2h{%Y-`G0&uybRhF+6-4uTtzW} z38&|vni&2=yaDH<0k{F5-hF0x{_+_d!@#}E_ZW_DKgJ-dB8SxylrVVx>4zj@f+~{?RON(Pwzf6@Cota)XczumKQ2!RQy*`R)X`w*4$L?T(U}njXI=b1Ij}GiNP$37_C5#Xg|@FwCZ6rQ`_8%NzIWljkx45!HAm+1 zS#7Q3b(L-}P3+xyin|vs&bb4CloDLz)+CX@sX4OIs&kY(27ln@x=q04>2+Z z0B?`4biD2l(_rdP0Px4NO&bXxPw#{>jNH?X5H|sMet2Q@H3Fb~da^MF5(&1K(%_G0 zES7V{wIj?Yi-=*cTvMsq2uo0@+L4z_9bwl5AXu#_+C_rZnlKDiQtcj?B~vzUn~L|^ zJ Date: Mon, 24 Mar 2025 17:39:11 +0100 Subject: [PATCH 18/32] Fixed boat deleting blocks under it or sum --- .../com/hbm/world/gen/NTMWorldGenerator.java | 9 +++++---- .../assets/hbm/structures/beached_patrol.nbt | Bin 9554 -> 7494 bytes 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 9d8f1d5dc..200a429e9 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -72,21 +72,22 @@ public class NTMWorldGenerator implements IWorldGenerator { }}); NBTStructure.registerStructure(0, new SpawnCondition() {{ - canSpawn = oceanBiomes::contains; + canSpawn = biome -> biome == BiomeGenBase.deepOcean; structure = new JigsawPiece("oil_rig", StructureManager.oil_rig); maxHeight = 48; minHeight = 47; - spawnWeight = 3; + spawnWeight = 2; }}); NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = beachBiomes::contains; structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol); + minHeight = 63; + maxHeight = 67; spawnWeight = 8; - maxHeight = 65; }}); - NBTStructure.registerNullWeight(0, 12); + NBTStructure.registerNullWeight(0, 2); Map bricks = new HashMap() {{ put(ModBlocks.meteor_brick, new MeteorBricks()); diff --git a/src/main/resources/assets/hbm/structures/beached_patrol.nbt b/src/main/resources/assets/hbm/structures/beached_patrol.nbt index 45e6face82b6979d5605860b194e580c5019626d..417f3bd8e248b656870132267a4ac9daefb70009 100644 GIT binary patch literal 7494 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 literal 9554 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 F{{VP{^Tz-H From d625a9a9d928f9a6c67d7ed33e0272c578ae35e2 Mon Sep 17 00:00:00 2001 From: Lazzzycatwastaken Date: Mon, 24 Mar 2025 22:12:11 +0100 Subject: [PATCH 19/32] Fixed doors on oil rig, Fixed waterlogging on aircraft carrier Balanced loot on aircraft carrier Removed derrick from oil rig and made it a purely cosmetic build removed asphalt from carrier because it made you 100x faster in water, and flung you across half the ocean. --- .../com/hbm/world/gen/NTMWorldGenerator.java | 14 +++++++------- .../hbm/structures/aircraft_carrier.nbt | Bin 28938 -> 19741 bytes .../assets/hbm/structures/oil_rig.nbt | Bin 28468 -> 33652 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 200a429e9..cd6480087 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -66,23 +66,23 @@ public class NTMWorldGenerator implements IWorldGenerator { NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = oceanBiomes::contains; - structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier); - maxHeight = 46; + structure = new JigsawPiece("aircraft_carrier", StructureManager.aircraft_carrier, -6); + maxHeight = 42; spawnWeight = 1; }}); NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> biome == BiomeGenBase.deepOcean; - structure = new JigsawPiece("oil_rig", StructureManager.oil_rig); - maxHeight = 48; - minHeight = 47; + structure = new JigsawPiece("oil_rig", StructureManager.oil_rig, -20); + maxHeight = 12; + minHeight = 11; spawnWeight = 2; }}); NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = beachBiomes::contains; - structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol); - minHeight = 63; + structure = new JigsawPiece("beached_patrol", StructureManager.beached_patrol, -5); + minHeight = 58; maxHeight = 67; spawnWeight = 8; }}); diff --git a/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt b/src/main/resources/assets/hbm/structures/aircraft_carrier.nbt index 5fb37d4bf83116fbe086b958130add216d24b3e4..221919653bc3c39767858783ed6453eddeaa7c1a 100644 GIT binary patch literal 19741 zcma*P30PBS);R7`w5UKURibS5tAYiTLxi1#<+QCw-o5kXzqXB=iP^52k(W3ByzSRIJL~UDeExoZ?W46uM#6K2ySz>u@?iV3 z6GEn23Cg*p=#A~C>9Molqsl#%k~#QF%jP3#%PNN2otrlTjOEbuD4 z9U<*fG%Wn;@40_T&K}RroH^HISa9z7OiOUKcG1x7gqhzS`soGlKgMjQ6%L1rkLpHB z9yaKFW=F6KLiH`Mj2)2&Y2{>Q4&UA`Vp`ywub8!+$+ex+)~)3EZPcFIjI^R$1nVOq zlL<5x=-byNo43f>@t0~3a`koXn714S&OSxK#^r)a?cQL~ybaf;&>`|r$3%*LV+ zH6Xkx&&Rn;Oyeo-a;EEn#8u3(A*tW zPWqZH^+DdE^wtXB=`f`^hfcRd2xO_9ygmynWB>hRLY_6zD%?MGZG+P^7ZQ`U4p(g?#2ybe!^mWBbLj?LYcoOyWBkD`B& zPw=m3k)kw04ETNa$=uj2h>U?QCUQf|bO?Fzq-u9fO2{6V zo!mQ_ZK+9_do-UK{{+T5RGt*i$`JqB{3JjBtQEbpr8~CZ%E1bXcI!F%Bc{tSJsCSS zxJuGU(=_Um`ai1EG@6ZyYeLPqz8f>W$4rj;o4o?{2WXtGmUCeNcG-J~*?YS773?8a zYX*esH}~0o&5e2sfe8s4X)C{y>~zn*14B3a3KrROokgU^lw2R>)mxAQx5AwH-M8#J zWO<5&e72VsMPUmoIdv;?sNVV5q_q3j`p^>?oXskASR7T4`QhN*~PxDiPVs@agP?ZAUoDj#8p!^dNHGhbt6_Z7(CriE3RK#bY@ce zK|_2~H_4;Ak@_kWy@4>cqVkW4*ir13zV8;wjoN`o4`9MTcro8~xskfu zh@Y%l9g5fuj#n(gY||xpo06=uNmkAzs|_ja&?NR0x~QsgVpfou6&H8dJiMrmcm^=J zg#$h*T+0}yS0t&rFhG)Ph&|naJ;jJsg#q;Z!rY;pz%}II3JYz)M`bho?u87lTpy9z z!38+5h9ydGTf@BKZL;2nhb|O&F1b{(eL*t&ONv*01>*%ZT!!z60fdWWgAt(iabt20dRWv0h+Ggu`uK^#gx|?P7>M^0PvHRpBXG~Zmun& zo-;#2&9o>xwo(S!I+sc2#|Z6CeAn$QeFN!SvrBB*K*B#y3A$t5SS{2be%(Qu#AYbr z@+kpF-0{E;TaYo2YKxv;;2Jn$2b{2{_5eYmdhbF*)(uXjufIJ(u7;O3FS&%3dOh;m*R#G~h{2uV_mlw6B6x9Wnby069RKDv3dHBIp%9%`yV&ksTk)Ko95nlagnQc6{$9&i67V0a|t>+80RR#ErebHBd zT$Yp-Ps;usv~s%eK2#98ns}wxzD1Neb!SGR+qH7ndAYK`Jg`Q zG|=le$Wx^YKdC0No9{aF4y*$w;pUkHtow;8JV+i181*Fxo2bI3?mjm3yb8Io31&`O z6c{rgy14+w2lHd(aai%R0JAhrisw7XD?pLa1COJy#=~=MKM>k+V0tw`Q~EI5>=GQO zm%uiQiYX$Ft39=a&3>_``+r_)>U-YA5ik@9Ysdxhs)L}aQxV(HmD3x$4Nfm~ zUlq@6%ViEY2mTXgePB0sU^iVZ1) zjL4nGvx-RBuRxW^{pIq$NEnDFgM30|0yxjX==kdZgB=&sOq>uiCnWS74L~Ta>J$)k z?Fj7x06uIQ>=E@;V;>dkqZ+WDTCl1q^E>cuz=>=hKKoF7_Ez}RL(y?tp!-CjUki@= zG+Vo6J~nz5kuLib8WbBn${a({uXLcaLJz=f9+)L&ap4H2>U8c6b9pCR3gtd#aT>^(A*; zZDpZHjg20%6ihCg=}E+>${mpI=t-5`7TnqB}7dW=I!s31;v;)(HVL*p86T>E8K4a`<3k<4W!cz+j z!13rsz%jYCe%Xgo*l0Sp&;U*ej&Icv&oj)nAAokZrQo!fs)BAg+Xon}f1lRJR1n0g z4|npu#0Bp24^T+N;+hCJ73ig@fDt&c(q!oT>us&caOK8rI~HuiWm=ff9KV6%w`eB4 zG>#yd%K<*p3a;nrVPck)SXI%cVl}8AHFeiR3&~l$*+yK}ntuy<2~pZC%pWj=3OYI} zX|<=Aa72O0gbpsloWcZ=0&15Y>$DLoqu8-BIoHOZy_E0j+XD1;wU^2+^+7>2jpN+d z7qXTa=Pu=K#A)9uFulf1f&(~-U&H-T!Fn<4{oI)g(7z)sdvd%#tU!#m*FqshEAV{AOF zxSOg-IQ^);DF5ba))587=Ai4As6iPWM7cw0s$tr6G&a|plxk5t^^x3YX4_AES5`|m zfdke5e_+`J11h;t3iOp(3XJWLqUsumxlr~;n8EKKkY{Pg&CbhAzB+I%2u|k#6$0-L z?~I0<8>+9zIWyDV5zx}kvq98gywl#hwC96&X10QDrF z2W0s>tjI^JveQc;io1nK2I2|~@f+9*oNgj!?MY^v0i&FXi?j56kY%a=H}nO6N1E;b z3>PDX#*I{NP>mW@d^oV;DuC`lloT4_6cW}z1t3^veVh>e*gyb zKj?2Z=r8Pj{3yfINjA8c#Ki$N+z@4m-bRpMX4^k;BEB14f${C=Uqa_TzU!$*jvz#_ zq)t$jZy@Une%9Ui1a(sh-ynZ?*M^U#Gz6Qyrx8g6jY0V1soa6yiBv{dLr9#UW3v6m zC^6V5qj*F&Gq*oyyn_bUpWelJar;xbURr;ql2AgCdaPn16+Zfz*5z!E1nbPm5c)B8 z-6c=IqOqrvqj}QE2|^?-ax`tZKk)B-d+SFHDkPWMI()*g)L&@s-Kf7JZMC;wpK z(Yz_25vCLMR`i_}YJya)$LJf;9!)~2K2d0=&ys9Ldvpk;=0tZpe@--k1(l3b>mn1H zaFSFT!z}rLSXBTI_auKno?HVnO!Cg^FZ}#D^>wrWV!Ce^Rr2hN7?dV)yqQ6qTgE&ETP4rIVPo$5Gebdn@TaY<+uy3bKx zV+y00IoXA+zFu(#@h2x@C$C)-r{@@9T~-gKb9d^PAM+^+vl_98vez-1b@P0OGFbb! zhyo}Thp~n&q9COw8&4IBpEk#yC_E@?2fdR`#=KNZS!JKe{R40u$$?R5U=#>Bp%(kF zxOPIj41n)i*xKg>S2T2mZ~}E)SR}MR1YpV?hG$!eKyX(8SE8l!`+!9NJwuy>DPI~0 ziXu;iJ-l(7BJ?O zR=5?JZps~$$o6VwT`+wzzkpz84vOKlw7GbaUoJ7K!`xX7)fBkcr-+RU`7&*BLc*h=!=2RFt8_Z-4J>F?nQ7+jnZYYh z4px@!$ZUT&cqKyMQvlj9w?xL+!v^<68fUqQx^$7duo;o-V1SHyg}~>8F-z_d-LKO2 zH}m@H{XzuP^yC+X+1knMof?1{cWNM(J2Cp-(4Nl;rK-l9kNAD@w}|eoG|4>MRuhqG zVnThi%#QD>pTgy2aOZX-g&mTO?G`oRL-9eeqN{l|PJ?$X3{NNxb2d_1D-HFBZ`a!s zHVB4zkuwd8g5a*#^gA{3$<~R7}bJFyXnY!iacqfP2{F^Er zz1RNbr`X}q23!$jJ=zeTnAz)C8*}E2^w+23d4^^>t;%yM)qX?mtW;X#bTeAoRS<8N zQdi&M5lucJGNF;&n*ul&TBz!2+^yS@J!V)yJJGEv0hxf@lVGL^Erq>xJLLgA>qmm= z>y0T71l1RYEiCs}@0l!QD}48uu^v%*4x1>Hvspia4DRL*z1+Z+3ZH7hU;|iR^%9WNyk%V zaj`G5V|B|t{KT??FS*g{umN>Kh_OHCmCP2()Ej7(HgWd!{vgKmAZXcD`D7dJS>F~; zO(i4V2=h|oySA@|*<`QByfg_RHvXLPFS#!>a2B%Hi`tr>fN%!75oINwPRCIlTi8vIe&^3|InSQ|abY)e=L}xMsBlzg zoeq-!ohX&X1-71p<*f8_c&j7MZqPP{Df!BuZr8KEk*Wo(z9k0N2vn7T7V9Ka0?^2n zY&_2$X(2*`?&$qt)iOy27kZmM31r*DxZ}ItSlPGjPk-B!qn+t@dj5W}dF|pa_fwPt zl6kGq*~j0uJJro!wH{q)4RJcRv@yJ1j>TvCM%tWvcBMVVI()cpDJ^8iuOUJNUvS&sn7OmLe)C$P~_ANU^D_7R$u&a@SUnfeR*Dt6I0+rH$wufe?5g8I(n zAzTy#%G?h}&XVa87*CG>1ZrZ$6ChVJKI?hNB?2VDo_ zOIkJK%Q4JZz80vb1k~l46^@`je~c&dyPmD}?bj1{!~k1inm1;1%C5qBQreTs;MsC3 zdX36uA=-+#edRJk$Hm^b_X*N#{+yiiT;EODE15Q8&(TJzxmsm?*I*49Nb`BF!O!@S zqE@Uy!ew`;TAwi`*YIPgYKHLMA)hFMfdyMr}&=B}B80nU_gKCf8ZT=NP_v<-2&%c(q55!X_Z0G0a-t@!yp1Ak< zs8?TH1c*;MMj7IZsp8@|JEoU;Nlg-WL=zhkUi1{G4~82y_7w|>!pJ*RLv@6)8AirDF76mXYN-(!@B~O%__ApeyC&rDI{K9jj1`&jB-J!5$1a z!=4E7&5AzxXh-SXdo;<8QeSP6U2}@ zgLA)1ik;%c1%|wNY-V!v^uYmn!2(a863n=1BONO&U-(ZC(Zi^kQuNbK(RlH6(-W5a zeF;jV?V#7C+ZB1vqd-1!~Qt`uCSm1tjN zODV%9fcv6KiNe&Tz6DD%3;~q*8`Tm0-DuQhqVR(z>P9%Pw3q2fS`*cH?Q7L9GM2&a zcvBZ>YFS^Bbb&i$*U_IEaa?~lIelEBNfQqC3xU~+c@qXd{T5~tgSt%ZNpSXf-nsNE@` zf>}8B*635uoQcY5!Mxj?Sm&^HV#Jx4U~TC?=9Ba(nI2W4fH3L({`85GYz&l?))oj~c1EYH-5B(%wM!ZAGj8natj<4)X0r zJIrf0AtY=IW#3j9FP{F!pL6Iuce}c(VkKj}TaC**j-8X|~ zmtN(+lE%FD5kmelgSYy|Uy@q^V>&G&_6$6~dTnq!-*s>u>_xR2c7%dvu?VKeNbXkx zIDc#Dj!L){##IEJFHSr#Gt*VD*h308Iw*UL1?~e<{OnH4Z?`@FcN7Bx7lbeY>eRlwv zAnPfc4_R6fw*{4QzhbKu@6;vSc2rIS+Pi#*`j2&phB|7woA_!bnVtLwwsR{}9yMaM z21gYezUWw}tFK2u?H;zUOBqqv!KYr;MAB_h zO9@eU{gn(zN+8Gw836X9i)ba)C36R8^vUk{T%7-qj?+rs{~9nTsP-*hu>YwzwFcT;DdL+}8*Wa$E#K+5#N>bzeRF;;km9Pcn431~D{hoH|le z7f+gOb57F#oO5^S!*N*op>S6*Bn z5<-Dwm6aPLWiE2-`uWFx(r|xH!&h9;>@DaLUd`~~2cTHP)#%a~{5cwY!P8G1HnR?A zCr8x4>THwW*Slb=yqAHO14-w-gUUZmX8UdmVz?-WGi(f7&jmzwv<_Ej=OH75Ik>-1 zJwDx+Ov4HX(Glkps<0wR2mM3$t!RqYAR&!JmpN~%@MnqB_jH#8_VSOEN`=dErgDmD zy->t>{E@P#VY$+f7c+IZLix)*?s-)yc9H->noDmy!Ee$m@z-eu?)bt=Z zN{tjXJy`xrAv>v7XW|l< zWs1Gb)Y{S{6S21@ZtXbGesx#mqbHZ=@AE58Di!b=hoGPH6N#UVET<%%m8FFH#Lo=( zCN8*SVx14KM#vs^dRvDpAF2Fe>KJEcYIJP}_dkw^@`(D16!q2YNY>o5=e3NPt0C6Y zL!e6eE$48r(@m$Y=_S$F)vq`pKxR$4wba4PM?_Di@akk_t@Td}LQl@;+s{as$P^SAB z|JS{!DvBiG>HJUdYE_zQr-Qtjp-2zCtiaElZ&@}l4&teele6Sbf%!g%;8TNk@hs8x zFma#&Jlf2EYwF7}rg2~((fdWF+SouXAw(PiLMXUtjDH4C9pmzcE#Q+D@o1-S{>{}a z)vv>fEN>)QX4f!&bf6%ygBu4eRx`B=K;!aopU4`&goa?rPC)d@Ind8|YRJv7tf|~v z$%F3wg>3G*o6o3@K5=G-`yH~iatzv2j%JRBxrD>OhGw75f@p23-TSz$*|P3HghmC~ zXEn>QZq%eKk#SxVRN`hHPTDvE&1LRv?-48tVb_aN@m()UTg>hv&XC_#V4)&%BCZ=B_tA+Taae|ji5aB z?TFvMzUB@@G9|GAlCy<*2MZ+yniL)dl{=G!b}iJIcMv=Swv&~NlSvvEOjyE$xF?JE z7_l0og{JGW7D}1&O72uefN*Zf1%{EZ)DJqR0KbZ3lcim}1s<~!WH5CtiUSQNTup>_ z&@H(TkXjJh)Dey`%6)0>q$iaBo-QwanSQMiWY|$ZuGmK*4fobW<^f`H$Pti`t5~kM zuuR2;Wu>d(#2_fNZ>b|uV1PD4dyWxG^N8-&G|s6e>hRylD|t}TcY;PbYPm~waSG1k z2%eWzYY*b@EGYPxWq9ig+*>D^C3(czYfte`W_{mAc^+>dG8xg$8l+XX8Gp`5BbArL zjRR><6Faa5ljx&8c7#$;H_rIOMpTyh5xg6S)d{rFC0u0b7};phP-m~WSD=-FDZh9+ zA|GtHHT#Rh%@o7YQ7lPmJK}Bo(PU1J*kExkvvsUC&UpGPxIRld*@hzv&qN!0Px&;& z&;2H}Xs;X#$BK%)oQLXSp4~HUf7+jDH~mKAxx7hptAU*V!<~OZTUB?lpv7$lwsIvwRZr!Zz^v$4$Z zCDA}q=0`o7DwjCoIk4g$S!^M(E_smmExXkP(4SO1+D5VP+g8E6GGB6b=|PIp>&YeV zqislwDR#*N-Bv*`^(DF21#r&l!;fC%rP9S5yC6nEP0Rn_&qKzqAiWnq?WL8RZRtx( zV9K;bS?Y-S4O(a*0e@{+@yl*h-L_Ew{JzyayU3Mq#`OpC^9Dgni=n-zIu_>p-4Xos zGa|NBCRkOw8Hw&+;C811)E?lf)WSe92b$|a@h3-NpM=1S~b(cbR=36H?H!VsM2_VQ=a7W4c z!JwVK)gSV}QHL!0OJ?07oH`z~Ea^yQ^+We7B5EoYHt}8k)*|Ylg)sFuyQW29sG;(0 zM4`tWDikx+$a^k81*hUmZv8rz`>!i$cJ7Z0n+Q@>Is1FJmp=i+kX!Dlh6|5w_Jny4 zhd1!wigfFUF<1_9BVr}~s9PhU^gPL34dHCUsM}Dk$ysKJDnH53$FaFPC{Rx5AQjSp z)dmEl;q&vVc3+TYuk6EoD_b}-z13~}zPxWqR+$|MoKTF~k8*G9KmskWwjeaC zlVF;c!d}Vy+GF_n{!e3Ha4hMy#^EXOGkdbCHEGr=2<-%mWo;UWsp^-wTLDk*#g2S} zX8ns``T@!Pd;sSSuz3BsLTd|U&tB18j`HIB;)8W^q;{W}=)M%-8~5mMnbwfN*LJdz zW7r(gQQoKyvS*O!rs|>3w1A*k-iBr+ zs3Jn{Yatb%fLElOK>)|TnHu{w_vu^6_%2b?g_Q)>_75~Gg$WFvDnT&S0yA?8`{`S< z0Q5mvdUY_pYe@Kcd@Cj7LG?$2gU)5g26u*q+sQ*iLw@2hdIo-Ctd|zDgRe?%I{Dqo z08i=4vat+1(bUn@_(67Uptp1?H!h)C4kCy+*jsB_-v#_;z`)xr!^3F;z2m2IbH%N6 z9<5}y85Fd{C#XKz9vR#jEqIYLb2yBbY}6L?H8!s_FykfY|6WX$gSj_h9jlQ4KwI!| zB31nOS#u-=O4!&tfbH4W_Hco3T)7?ZOolC++%T6P#V0N zPZiI1G|PNOKThQ?ONc$-yO{`H&~B*QgESlcKjfa79&rBC+KxC-aoIKgM}o8w6b~xL zhY{xs+!}2fCnt^TyPvhNyQjT{YOaIud{Fsml1HG=xfxJ~K^b@@Zn%R#@ya1u3H&+% zd~6uiPCXaFg(D0Y&G0-h4uZ_$IJmqEt6yh`+hBH_WNN1g5Q3svP1JUQ>(bzlJCE}y z;5uK!qu{EGVx|t_H&{3lF~^IG^%Gr(bsx#OOw~Qw6NX%GByB7HlNNP5l5ZssIIJorl zU2)I0-vMkA;A!y(fX-CFo-cmQVeG!&{(?ke_V17k!7|*?B+nuRM3;f=-noyUFd(B0 zEhB71Cxttif)5I23+gyn6X{rgxg9|_iSKFz1`iWs|4GXX8Xe*$qUlo@Ztk^tXrAK> zzJmo`w@J8hvPu`(;m?Fjbuh2ft6Rk{>GWZ5w8VhDx8$l+Ne@I?kU}ET*a^s>&!l+z~e-JptEFb(A-=4)Wm03DH3i3J9?(H{QU{##(%$ zS-7dSZ4IG)4c`^6-v$B;q>@(v?7T0$pI3aKUwh&{Nbus{VVOShyMrDPTyOC}2B~ZS ztX*Ik62_oV(ryKXDfkvQm|tXvoCSs0VDCD-7pwYY_R2oax`kL{r#EAc)+93Q)_^l? zVLWdQ;;<17Ol|P81$(d^{$^NScpvWR_xiZfSEj_2*WF_9)q2#Wd-z|sVhEA1pz z@5fIGEHE4u;e!U>I0%M|rsE-L_GDEETnhV@$TU18&T_x1`n8BPyc|N==ykoXN3tbW zKDz=c6dfdF8jn2-bpRd8B~L?H^l)RJ7*IuJ>4wZ)~q+OAPj9dPe88O zV#$NVs_&7|_dySXJ*6MrhGl!83^#M^2TiQrgvR84KX~8*_nJ0H828puR3U~b+`yd> z&OzFMgl+2Ri1p+wC31wb#Bc%Nf%qv$-K(8m0 zSRJ5E?$PRqyE|C_>sMUr#T8)J)&y+BUc!+t8&23Bpqb&IAv>eD(DdOt&2Yy1^@|Bx&Pnu;AG)WAR)2?`%#T0NbMB$$%-v@Rb+yl%hZma)&M&oDVjGr;e!q}^ ze%N#JRODDhv1jgE2tdeQO!x^}HbH3j08VW?9^w>!L!WhE7Z}nLNDpVSyDor_2lW(q z`|g6nm-`k)Kpp>x?0{tHlCq;x*yOL-j2>$O#Lc{o08D*?1|D63j=20&G6T#v5TjN% zb0UAXx*A~SjRSqUEHst-5*Ehg*Pz{vJ=oI`qDye?Sh|BQQ%?GhTIg9g|C?w^q2%YZ zDy_4hjMplTK0bVSuH0N}c{2BQ%=A)@QYux7wKqSnG#sss46%`S4TdX!8*mw2yfs1zj?z1=W-mv{B5chSD*Iv$&sD=J2pe;FvViDfchu&I0AM$6U^^0G))rbuWD))%vg6fUM$nUgR7 z`WPI&_P6XSFWRijI=_{*Uojh8H47K_;`{JeB5MbU&YIoSp!|Ca#7{agEXWW8c+7I! z5YaN!^d`;hvL>Zb1L7ZwiV32NsloM4`q=9bgF@zS9_qlDG zCT?E^_rEXtPXrlY=XJ63gGA^$dX(fcGH2d#|L(&w^Io0nxvdZT)9w=D2U6I?RPGJ~ zipwE2XS8zz)3##MC4#pav3elDY?uFJ>%WMz?>Q3`{u((V@G(4^$#?y<1vH_C*YV(Fc!HWHs-VW{liFa3t;Z2V z)~B|hKt1vc^H%YoVf>Iql#8_0fb{35d&?F|xc41!nme))Y%U3p-}=9v$hL8!+wlNl zWK+a^vB?qC?R!G$UXnYM2>PnMnq8AQm$p)N-0?hL zWDkB4xQ*3SiYH|y->L%++yl15hxj?kG6eq|`u7N|6&W`uk@OL65Od*<4z&LPqTS$u z{m@55)a`9(!sC-SPuBcEz+MMd_TVL;9qUXl(dg=&y~*5{a8o&V^zdHv5Wsbs$^WW8 zM&P@J^5ji8cfVPXTXv#lSt?t0bUZwLMSm1g;-9pTQ4<=;N=zieP51}ku3GF!WU7hdrL0k^vXcJ)%G1*Za_`}=; zf~{@Vf)mw&J4B@HCkX48z6(Q!T`8vpeo5;h=lA0JZ!_421?T}*84qGu<%@t%#eFP+ zv5gFW$)XA)pH~Ari*upYn2J{g-c=bf@q%R-r{S!Emkn?dI9F7Q2e4OLX#l~84=}*; z3fmHW;>wyqN9&dPLJ^6iSH^1&Zi&yXm2j zbX|x}CWSj~s0(aqw2<>CV^X>kz3L_G%$M4T$cSKXNkT;Xi>K z@U+k=#M8@h7ZvzP8_{qo@*VgQ1xi#q-7!cA`b$(?R$dZ4s}B}wVJS# zJotWwfZ!cNte)ONk*eX_nnt68pS^u1`1#4~F;OghU;~01R?4`s1_)j_ue|vToc8hD zA~@(FleStEze5+;Q{5hL5vSoI_JX56FFFa>ovL4)_AlMqg1ZPn&_iBPN`JW;n62X~ z-op_Nylvkdh$6<1hpgnqoS_gV5Zj}`uSXS(%<@gVExta?D~V92T85SNNi*EX+wLFg zs3-c+Cm6gRXcAK~$RTlldMi!|{OzM9U3Vi0E51~gC*LImt@oEaABWx<9Kr)e1*ixHx9nAAoF1yU-=}->Q`0j zo(S(lKbFQ@C}Rw;$H7Nh!uL5igDAT*iJ+?!ehf8-7h;+i*5!S4uAXQWJ>pe39Wu2; z8bZU}3{)R<@N`NU1P}et{D4=Wp7#s_rm+d4rSqt798{g-K?!iE^gpEY@s&4`~+ z_4eW;5fPWz;vcd1vEO0B?r7!%8a-c=GWM+CS}RobLJ0*Q-yhO=O9<6}5R+|COwj!u zm~omRuMKkfvxx{>ays5Cp1j0;BL5D0hU-7}4l*V+{=NGNmzBPpJn^}_0vtye`>Vi+ zdD&hpxvtj3 zF*C#V3%~x#?^_-ZS5AEWTlfj(Z=c7`M;J6jDwb{^o_lXz5p!y|Hr}aaW^pRUX>K%O zBECrJ(jfoM#oT`3fmX&ygUoX+S9W+b_Ss>N!jaKdaM8b&5F<8kSo+P}P{%B$Vze%5 zYF2(bW@a%?T(SHpa;c{#!=_E4^Jt(Vd_>=4e7SSv_TI$#-^{g&92;C5c>>u-i`j|K zpWn*o`E4^8u6XEJ2Zrcrosif=%W5%;S;fj{3&z$N5Ue8pZfGhzHX$=+;r@4-{bg6B zjDMxLEO(|~z1>h7B^4DLPAxu+xcazp?A(-&7JbZbbn%zHbFuSx86%2kv*y#`W6{gQ zwXJhA%OlINFQ`J8QE+~%yfOCa@SHznY3tf_+rn+*t$xE_2P2+ZN`}?p*+*E zD?-t8SWy=-CsKfo_qox??F8AWndcJ?%HPK9ibj_2D3_lsn>#EhynCIV|MFY8v-PN> z=wa;8&(HT67D{Uzd5QOC4GUWzJnk8rZVxWDi_OxEDZk%kxZE#3CYV~Ax%KacHt>?xRAlE$|`C}J!Z_)yck75{ja@XHnI{VvDY&*pb4g@@$_?=hl3 zoHNW(eEc{m^}n*`Bt_@FGVhoKhxj8oRyvA=f%)gc@C2!oLVi!4IWsxT3Rmtw^&nVL zyL|6(%&bXzIAeKuF)cI1WX8dH-f*;T$#nX^7VR;7|!ox5}W Gn*RrF2rcWVY{^tmAgF{zcC7*x2C!u@ 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 br}`v>>z(xrm&G?OujTEzl=i2*(3<}NSX$mL diff --git a/src/main/resources/assets/hbm/structures/oil_rig.nbt b/src/main/resources/assets/hbm/structures/oil_rig.nbt index 6540893a477c76424add14785acad44466f9355c..841f65cde02c710ab76ab4e10eb2ea7290d0025a 100644 GIT binary patch literal 33652 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%0DBFzPb*M6*8_^4!oFNtegaxs$+Xf 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 From dfd5d2c2a64f2218dde20ec73319300e35ea80e5 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 25 Mar 2025 10:29:21 +1100 Subject: [PATCH 20/32] They Came From OUTER SPACE --- .../com/hbm/blocks/generic/BlockModDoor.java | 16 ++- .../com/hbm/blocks/generic/BlockPlushie.java | 34 +++-- .../hbm/blocks/generic/BlockWandJigsaw.java | 3 + .../com/hbm/blocks/generic/BlockWandLoot.java | 6 + .../hbm/blocks/machine/BlockMachineBase.java | 31 +++-- .../com/hbm/blocks/machine/MachineEPress.java | 10 +- .../com/hbm/blocks/machine/Spotlight.java | 32 ++++- .../com/hbm/blocks/machine/rbmk/RBMKBase.java | 7 +- .../java/com/hbm/items/tool/ItemWand.java | 118 ++++++++---------- .../java/com/hbm/world/gen/NBTStructure.java | 112 ++++++++++++++--- 10 files changed, 254 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java index b0ccc6634..233f8da71 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockModDoor.java +++ b/src/main/java/com/hbm/blocks/generic/BlockModDoor.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.items.ModItems; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -20,7 +21,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockModDoor extends Block { +public class BlockModDoor extends Block implements INBTTransformable { @SideOnly(Side.CLIENT) private IIcon[] field_150017_a; @SideOnly(Side.CLIENT) @@ -234,7 +235,7 @@ public class BlockModDoor extends Block { } p_149727_1_.playSoundEffect(p_149727_2_, p_149727_3_, p_149727_4_, "hbm:block.openDoor", 1.0F, p_149727_1_.rand.nextFloat() * 0.1F + 0.9F); - + return true; } @@ -311,10 +312,10 @@ public class BlockModDoor extends Block { } public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { - + if((p_149650_1_ & 8) != 0) return null; - + if (this == ModBlocks.door_metal) return ModItems.door_metal; else if (this == ModBlocks.door_office) @@ -396,4 +397,9 @@ public class BlockModDoor extends Block { p_149681_1_.setBlockToAir(p_149681_2_, p_149681_3_ - 1, p_149681_4_); } } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDoor(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java index 5d4709b72..848065a84 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPlushie.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPlushie.java @@ -5,6 +5,8 @@ import java.util.Random; import com.hbm.blocks.IBlockMulti; import com.hbm.blocks.ITooltipProvider; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -27,7 +29,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider { +public class BlockPlushie extends BlockContainer implements IBlockMulti, ITooltipProvider, INBTTransformable { public BlockPlushie() { super(Material.cloth); @@ -37,7 +39,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } @Override public Item getItemDropped(int i, Random rand, int j) { return null; } - + @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { TileEntityPlushie entity = (TileEntityPlushie) world.getTileEntity(x, y, z); @@ -47,7 +49,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - + if(!player.capabilities.isCreativeMode) { harvesters.set(player); if(!world.isRemote) { @@ -63,7 +65,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti harvesters.set(null); } } - + @Override public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) { player.addStat(StatList.mineBlockStatArray[getIdFromBlock(this)], 1); @@ -80,7 +82,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int meta = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15; world.setBlockMetadataWithNotify(x, y, z, meta, 2); - + TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.type = PlushieType.values()[Math.abs(stack.getItemDamage()) % PlushieType.values().length]; plushie.markDirty(); @@ -93,7 +95,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(world.isRemote) { TileEntityPlushie plushie = (TileEntityPlushie) world.getTileEntity(x, y, z); plushie.squishTimer = 11; @@ -104,8 +106,13 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti } } - public static class TileEntityPlushie extends TileEntity { - + @Override + public int transformMeta(int meta, int coordBaseMode) { + return (meta + coordBaseMode * 4) % 16; + } + + public static class TileEntityPlushie extends TileEntity implements INBTTileEntityTransformable { + public PlushieType type = PlushieType.NONE; public int squishTimer; @@ -120,7 +127,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti this.writeToNBT(nbt); return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); } - + @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { this.readFromNBT(pkt.func_148857_g()); @@ -137,8 +144,13 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti super.writeToNBT(nbt); nbt.setByte("type", (byte) type.ordinal()); } + + @Override + public void transformTE(World world, int coordBaseMode) { + type = PlushieType.values()[world.rand.nextInt(PlushieType.values().length - 1) + 1]; + } } - + public static enum PlushieType { NONE( "NONE", null), YOMI( "Yomi", "Hi! Can I be your rabbit friend?"), @@ -147,7 +159,7 @@ public class BlockPlushie extends BlockContainer implements IBlockMulti, IToolti public String label; public String inscription; - + private PlushieType(String label, String inscription) { this.label = label; this.inscription = inscription; diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java index a8a44a55e..365c42e56 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java @@ -9,6 +9,7 @@ import com.hbm.blocks.IBlockSideRotation; import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ModBlocks; import com.hbm.interfaces.IControlReceiver; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.packet.PacketDispatcher; @@ -144,6 +145,8 @@ public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotatio return true; } + if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.wand_s) return false; + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java index 80b1f3b92..2440a5d7d 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -12,6 +12,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.config.StructureConfig; import com.hbm.itempool.ItemPool; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; import com.hbm.util.I18nUtil; @@ -248,6 +249,11 @@ public class BlockWandLoot extends BlockContainer implements ILookOverlay, ITool } private void replace() { + if(!(worldObj.getBlock(xCoord, yCoord, zCoord) instanceof BlockWandLoot)) { + MainRegistry.logger.warn("Somehow the block at: " + xCoord + ", " + yCoord + ", " + zCoord + " isn't a loot block but we're doing a TE update as if it is, cancelling!"); + return; + } + WeightedRandomChestContent[] pool = ItemPool.getPool(poolName); worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2); diff --git a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java index 817914f5c..b5d111c13 100644 --- a/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java +++ b/src/main/java/com/hbm/blocks/machine/BlockMachineBase.java @@ -1,6 +1,7 @@ package com.hbm.blocks.machine; import com.hbm.main.MainRegistry; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -16,8 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public abstract class BlockMachineBase extends BlockContainer { - +public abstract class BlockMachineBase extends BlockContainer implements INBTTransformable { + int guiID = -1; protected boolean rotatable = false; @@ -25,13 +26,13 @@ public abstract class BlockMachineBase extends BlockContainer { super(mat); this.guiID = guiID; } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - + if(guiID == -1) return false; - + if(world.isRemote) { return true; } else if(!player.isSneaking()) { @@ -41,9 +42,9 @@ public abstract class BlockMachineBase extends BlockContainer { return false; } } - + private static boolean keepInventory; - + @Override public void breakBlock(World world, int x, int y, int z, Block block, int meta) { @@ -96,18 +97,24 @@ public abstract class BlockMachineBase extends BlockContainer { super.breakBlock(world, x, y, z, block, meta); } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - + if(!rotatable) return; - + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + if(!rotatable) return meta; + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 3e3ea35ab..465ea6c69 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineEPress; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.Block; @@ -19,7 +20,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineEPress extends BlockContainer { +public class MachineEPress extends BlockContainer implements INBTTransformable { private final Random field_149933_a = new Random(); private static boolean keepInventory; @@ -120,4 +121,9 @@ public class MachineEPress extends BlockContainer { return false; } } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index f5a89d404..8c1c57663 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -15,6 +15,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -26,6 +27,8 @@ import net.minecraftforge.common.util.ForgeDirection; public class Spotlight extends Block implements ISpotlight, INBTTransformable { + public static boolean disableOnGeneration = true; + // I'd be extending the ReinforcedLamp class if it wasn't for the inverted behaviour of these specific lights // I want these blocks to be eminently useful, so removing the need for redstone by default is desired, // these act more like redstone torches, in that applying a signal turns them off @@ -220,6 +223,31 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { return ForgeDirection.getOrientation(metadata >> 1); } + // Replace bulbs on broken lights with a click + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + int meta = world.getBlockMetadata(x, y, z); + if(!isBroken(meta)) return false; + + repair(world, x, y, z); + return true; + } + + private void repair(World world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + if(!isBroken(meta)) return; + + world.setBlock(x, y, z, getOn(), meta - 1, 2); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + int ox = x + dir.offsetX; + int oy = y + dir.offsetY; + int oz = z + dir.offsetZ; + Block block = world.getBlock(ox, oy, oz); + if(block == this) repair(world, ox, oy, oz); + } + } + public boolean isBroken(int metadata) { return (metadata & 1) == 1; } @@ -326,11 +354,13 @@ public class Spotlight extends Block implements ISpotlight, INBTTransformable { @Override public int transformMeta(int meta, int coordBaseMode) { // +1 to set as broken, won't turn on until broken and replaced - return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + 1; + int disabled = disableOnGeneration ? 1 : 0; + return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + disabled; } @Override public Block transformBlock(Block block) { + if(!disableOnGeneration) return block; if(block == ModBlocks.spotlight_incandescent) return ModBlocks.spotlight_incandescent_off; if(block == ModBlocks.spotlight_fluoro) return ModBlocks.spotlight_fluoro_off; if(block == ModBlocks.spotlight_halogen) return ModBlocks.spotlight_halogen_off; diff --git a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java index 6dba321ce..df7899d3a 100644 --- a/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java +++ b/src/main/java/com/hbm/blocks/machine/rbmk/RBMKBase.java @@ -206,4 +206,9 @@ public abstract class RBMKBase extends BlockDummyable implements IToolable, ILoo public static int renderIDRods = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDPassive = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDControl = RenderingRegistry.getNextAvailableRenderId(); -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return meta; + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/items/tool/ItemWand.java b/src/main/java/com/hbm/items/tool/ItemWand.java index 9bb6dc6ca..69d05195d 100644 --- a/src/main/java/com/hbm/items/tool/ItemWand.java +++ b/src/main/java/com/hbm/items/tool/ItemWand.java @@ -2,8 +2,11 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.blocks.ModBlocks; + import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -11,98 +14,87 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; public class ItemWand extends Item { - + + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { list.add("Creative-only item"); list.add("\"Destruction brings creation\""); list.add("(Set positions with right click,"); list.add("set block with shift-right click!)"); - - if(itemstack.stackTagCompound != null && - !(itemstack.stackTagCompound.getInteger("x") == 0 && - itemstack.stackTagCompound.getInteger("y") == 0 && - itemstack.stackTagCompound.getInteger("z") == 0)) - { - list.add("Pos: " + itemstack.stackTagCompound.getInteger("x") + ", " + itemstack.stackTagCompound.getInteger("y") + ", " + itemstack.stackTagCompound.getInteger("z")); + + if(stack.stackTagCompound != null && !(stack.stackTagCompound.getInteger("x") == 0 && stack.stackTagCompound.getInteger("y") == 0 && stack.stackTagCompound.getInteger("z") == 0)) { + list.add("Pos: " + stack.stackTagCompound.getInteger("x") + ", " + stack.stackTagCompound.getInteger("y") + ", " + stack.stackTagCompound.getInteger("z")); } else { list.add("Positions not set!"); } - if(itemstack.stackTagCompound != null) - list.add("Block saved: " + Block.getBlockById(itemstack.stackTagCompound.getInteger("block")).getUnlocalizedName()); + if(stack.stackTagCompound != null) + list.add("Block saved: " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName()); } - + @Override - public boolean onItemUse(ItemStack p_77648_1_, EntityPlayer p_77648_2_, World p_77648_3_, int p_77648_4_, int p_77648_5_, int p_77648_6_, int p_77648_7_, float p_77648_8_, float p_77648_9_, float p_77648_10_) - { - if(p_77648_1_.stackTagCompound == null) - { - p_77648_1_.stackTagCompound = new NBTTagCompound(); + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); } - - if(p_77648_2_.isSneaking()) - { - p_77648_1_.stackTagCompound.setInteger("block", Block.getIdFromBlock(p_77648_3_.getBlock(p_77648_4_, p_77648_5_, p_77648_6_))); - p_77648_1_.stackTagCompound.setInteger("meta", p_77648_3_.getBlockMetadata(p_77648_4_, p_77648_5_, p_77648_6_)); - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(p_77648_1_.stackTagCompound.getInteger("block")).getUnlocalizedName())); + + if(player.isSneaking()) { + stack.stackTagCompound.setInteger("block", Block.getIdFromBlock(world.getBlock(x, y, z))); + stack.stackTagCompound.setInteger("meta", world.getBlockMetadata(x, y, z)); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName())); } else { - if(p_77648_1_.stackTagCompound.getInteger("x") == 0 && - p_77648_1_.stackTagCompound.getInteger("y") == 0 && - p_77648_1_.stackTagCompound.getInteger("z") == 0) - { - p_77648_1_.stackTagCompound.setInteger("x", p_77648_4_); - p_77648_1_.stackTagCompound.setInteger("y", p_77648_5_); - p_77648_1_.stackTagCompound.setInteger("z", p_77648_6_); - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Position set!")); + if(stack.stackTagCompound.getInteger("x") == 0 && stack.stackTagCompound.getInteger("y") == 0 && stack.stackTagCompound.getInteger("z") == 0) { + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Position set!")); } else { - - int x = p_77648_1_.stackTagCompound.getInteger("x"); - int y = p_77648_1_.stackTagCompound.getInteger("y"); - int z = p_77648_1_.stackTagCompound.getInteger("z"); - - p_77648_1_.stackTagCompound.setInteger("x", 0); - p_77648_1_.stackTagCompound.setInteger("y", 0); - p_77648_1_.stackTagCompound.setInteger("z", 0); - - if(!p_77648_3_.isRemote) - { - for(int i = Math.min(x, p_77648_4_); i <= Math.max(x, p_77648_4_); i++) - { - for(int j = Math.min(y, p_77648_5_); j <= Math.max(y, p_77648_5_); j++) - { - for(int k = Math.min(z, p_77648_6_); k <= Math.max(z, p_77648_6_); k++) - { - p_77648_3_.setBlock(i, j, k, Block.getBlockById(p_77648_1_.stackTagCompound.getInteger("block")), p_77648_1_.stackTagCompound.getInteger("meta"), 3); + + int ox = stack.stackTagCompound.getInteger("x"); + int oy = stack.stackTagCompound.getInteger("y"); + int oz = stack.stackTagCompound.getInteger("z"); + + stack.stackTagCompound.setInteger("x", 0); + stack.stackTagCompound.setInteger("y", 0); + stack.stackTagCompound.setInteger("z", 0); + + if(!world.isRemote) { + Block block = Block.getBlockById(stack.stackTagCompound.getInteger("block")); + int meta = stack.stackTagCompound.getInteger("meta"); + boolean replaceAir = block == ModBlocks.wand_air; + + for(int i = Math.min(ox, x); i <= Math.max(ox, x); i++) { + for(int j = Math.min(oy, y); j <= Math.max(oy, y); j++) { + for(int k = Math.min(oz, z); k <= Math.max(oz, z); k++) { + if(replaceAir && world.getBlock(i, j, k) != Blocks.air) continue; + world.setBlock(i, j, k, block, meta, 3); } } } } - if(p_77648_3_.isRemote) - p_77648_2_.addChatMessage(new ChatComponentText("Selection filled!")); + if(world.isRemote) + player.addChatMessage(new ChatComponentText("Selection filled!")); } } - - return true; - } + + return true; + } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - if(stack.stackTagCompound == null) - { + if(stack.stackTagCompound == null) { stack.stackTagCompound = new NBTTagCompound(); } - if(player.isSneaking()) - { + if(player.isSneaking()) { stack.stackTagCompound.setInteger("block", 0); stack.stackTagCompound.setInteger("meta", 0); if(world.isRemote) player.addChatMessage(new ChatComponentText("Set block " + Block.getBlockById(stack.stackTagCompound.getInteger("block")).getUnlocalizedName())); } - + return stack; } -} +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/NBTStructure.java index 6ec619378..d69a64572 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/NBTStructure.java @@ -16,6 +16,7 @@ import com.hbm.handler.ThreeInts; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; import com.hbm.util.Tuple.Quartet; +import com.hbm.util.fauxpointtwelve.BlockPos; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.*; @@ -94,7 +95,7 @@ public class NBTStructure { } } - public static void registerStructure(SpawnCondition spawn, int... dimensionIds) { + public static void registerStructure(SpawnCondition spawn, int[] dimensionIds) { for(int dimensionId : dimensionIds) { registerStructure(dimensionId, spawn); } @@ -265,6 +266,10 @@ public class NBTStructure { } palette[i] = new BlockDefinition(blockName, meta); + + if(StructureConfig.debugStructures && palette[i].block == Blocks.air) { + palette[i] = new BlockDefinition(ModBlocks.wand_air, meta); + } } @@ -349,7 +354,7 @@ public class NBTStructure { if(connections.size() > 0) { fromConnections = new ArrayList<>(); - connections.sort((a, b) -> a.selectionPriority - b.selectionPriority); // sort by descending priority, highest first + connections.sort((a, b) -> b.selectionPriority - a.selectionPriority); // sort by descending priority, highest first // Sort out our from connections, splitting into individual lists for each priority level List innerList = null; @@ -439,7 +444,7 @@ public class NBTStructure { int ry = by + y; Block block = transformBlock(state.definition, null, world.rand); - int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + int meta = transformMeta(state.definition, null, coordBaseMode); world.setBlock(rx, ry, rz, block, meta, 2); @@ -496,7 +501,7 @@ public class NBTStructure { int ry = by + oy; Block block = transformBlock(state.definition, piece.blockTable, world.rand); - int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + int meta = transformMeta(state.definition, piece.blockTable, coordBaseMode); world.setBlock(rx, ry, rz, block, meta, 2); @@ -552,10 +557,16 @@ public class NBTStructure { return definition.block; } - private int transformMeta(BlockDefinition definition, int coordBaseMode) { + private int transformMeta(BlockDefinition definition, Map blockTable, int coordBaseMode) { + if(blockTable != null && blockTable.containsKey(definition.block)) { + return blockTable.get(definition.block).getSelectedBlockMetaData(); + } + // Our shit if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); + if(coordBaseMode == 0) return definition.meta; + // Vanilla shit if(definition.block instanceof BlockStairs) return INBTTransformable.transformMetaStairs(definition.meta, coordBaseMode); if(definition.block instanceof BlockRotatedPillar) return INBTTransformable.transformMetaPillar(definition.meta, coordBaseMode); @@ -566,6 +577,7 @@ public class NBTStructure { if(definition.block instanceof BlockLever) return INBTTransformable.transformMetaLever(definition.meta, coordBaseMode); if(definition.block instanceof BlockSign) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); if(definition.block instanceof BlockLadder) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTripWireHook) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); return definition.meta; } @@ -630,6 +642,11 @@ public class NBTStructure { this.meta = meta; } + BlockDefinition(Block block, int meta) { + this.block = block; + this.meta = meta; + } + } public static class SpawnCondition { @@ -670,6 +687,31 @@ public class NBTStructure { return pools.get(name).clone(); } + // Builds all of the pools into neat rows and columns, for editing and debugging! + // Make sure structure debug is enabled, or it will no-op + // Do not use in generation + public void buildAll(World world, int x, int y, int z) { + if(!StructureConfig.debugStructures) return; + + int padding = 5; + int oz = 0; + + for(JigsawPool pool : pools.values()) { + int highestWidth = 0; + int ox = 0; + + for(Pair entry : pool.pieces) { + NBTStructure structure = entry.key.structure; + structure.build(world, x + ox + (structure.size.x / 2), y, z + oz + (structure.size.z / 2)); + + ox += structure.size.x + padding; + highestWidth = Math.max(highestWidth, structure.size.z); + } + + oz += highestWidth + padding; + } + } + } // A set of pieces with weights @@ -790,7 +832,7 @@ public class NBTStructure { boolean heightUpdated = false; - int priority; // placement priority not yet implemented because selection priority is far more useful whatever + int priority; // this is fucking hacky but we need a way to update ALL component bounds once a Y-level is determined private Start parent; @@ -941,6 +983,17 @@ public class NBTStructure { return false; } + protected boolean isInsideIgnoringSelf(LinkedList components, int x, int y, int z) { + for(StructureComponent component : components) { + if(component == this) continue; + if(component.getBoundingBox() == null) continue; + + if(component.getBoundingBox().isVecInside(x, y, z)) return true; + } + + return false; + } + } public static class Start extends StructureStart { @@ -966,7 +1019,15 @@ public class NBTStructure { // Iterate through and build out all the components we intend to spawn while(!queuedComponents.isEmpty()) { - final int i = rand.nextInt(queuedComponents.size()); + queuedComponents.sort((a, b) -> b.priority - a.priority); // sort by placement priority descending + int matchPriority = queuedComponents.get(0).priority; + int max = 1; + while(max < queuedComponents.size()) { + if(queuedComponents.get(max).priority != matchPriority) break; + max++; + } + + final int i = rand.nextInt(max); Component fromComponent = queuedComponents.remove(i); if(fromComponent.piece.structure.fromConnections == null) continue; @@ -1008,9 +1069,14 @@ public class NBTStructure { queuedComponents.add(nextComponent); } else { // If we failed to fit anything in, grab something from the fallback pool, ignoring bounds check + // unless we are perfectly abutting another piece, so grid layouts can work! if(nextPool.fallback != null) { - nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); - addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + BlockPos checkPos = getConnectionTargetPosition(fromComponent, fromConnection); + + if(!fromComponent.isInsideIgnoringSelf(components, checkPos.getX(), checkPos.getY(), checkPos.getZ())) { + nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); + if(nextComponent != null) addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + } } } } @@ -1037,6 +1103,18 @@ public class NBTStructure { component.priority = placementPriority; } + private BlockPos getConnectionTargetPosition(Component component, JigsawConnection connection) { + // The direction this component is extending towards in ABSOLUTE direction + ForgeDirection extendDir = component.rotateDir(connection.dir); + + // Set the starting point for the next structure to the location of the connector block + int x = component.getXWithOffset(connection.pos.x, connection.pos.z) + extendDir.offsetX; + int y = component.getYWithOffset(connection.pos.y) + extendDir.offsetY; + int z = component.getZWithOffset(connection.pos.x, connection.pos.z) + extendDir.offsetZ; + + return new BlockPos(x, y, z); + } + private Component buildNextComponent(Random rand, SpawnCondition spawn, JigsawPool pool, Component fromComponent, JigsawConnection fromConnection) { JigsawPiece nextPiece = pool.get(rand); if(nextPiece == null) return null; @@ -1046,23 +1124,17 @@ public class NBTStructure { JigsawConnection toConnection = connectionPool.get(rand.nextInt(connectionPool.size())); - // The direction this component is extending towards in ABSOLUTE direction - ForgeDirection extendDir = fromComponent.rotateDir(fromConnection.dir); - // Rotate our incoming piece to plug it in int nextCoordBase = fromComponent.getNextCoordBase(fromConnection, toConnection, rand); - // Set the starting point for the next structure to the location of the connector block - int nextX = fromComponent.getXWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetX; - int nextY = fromComponent.getYWithOffset(fromConnection.pos.y) + extendDir.offsetY; - int nextZ = fromComponent.getZWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetZ; + BlockPos pos = getConnectionTargetPosition(fromComponent, fromConnection); // offset the starting point to the connecting point - nextX -= nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); - nextY -= toConnection.pos.y; - nextZ -= nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int ox = nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + int oy = toConnection.pos.y; + int oz = nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); - return new Component(spawn, nextPiece, rand, nextX, nextY, nextZ, nextCoordBase).connectedFrom(toConnection); + return new Component(spawn, nextPiece, rand, pos.getX() - ox, pos.getY() - oy, pos.getZ() - oz, nextCoordBase).connectedFrom(toConnection); } private List getConnectionPool(JigsawPiece nextPiece, JigsawConnection fromConnection) { From 20bd424cd4d64fc7a74904ffa89fc42cce681f11 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 25 Mar 2025 12:23:18 +1100 Subject: [PATCH 21/32] fix rare crash when generating structures --- src/main/java/com/hbm/world/gen/NBTStructure.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/NBTStructure.java index d69a64572..e7e03185c 100644 --- a/src/main/java/com/hbm/world/gen/NBTStructure.java +++ b/src/main/java/com/hbm/world/gen/NBTStructure.java @@ -1075,7 +1075,7 @@ public class NBTStructure { if(!fromComponent.isInsideIgnoringSelf(components, checkPos.getX(), checkPos.getY(), checkPos.getZ())) { nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); - if(nextComponent != null) addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback } } } @@ -1097,6 +1097,7 @@ public class NBTStructure { @SuppressWarnings("unchecked") private void addComponent(Component component, int placementPriority) { + if(component == null) return; components.add(component); component.parent = this; From a2f5eeada77d1b0f0af84f5ba27add3644ede365 Mon Sep 17 00:00:00 2001 From: George Paton Date: Tue, 25 Mar 2025 16:42:00 +1100 Subject: [PATCH 22/32] Add crafting recipes for RBMK fuel cooling, rod disassembly, and waste decaying --- .../nei/RBMKRodDisassemblyHandler.java | 85 +++++++++ .../handler/nei/RBMKWasteDecayHandler.java | 40 ++++ .../inventory/recipes/FuelPoolRecipes.java | 12 +- .../com/hbm/items/machine/ItemRBMKPellet.java | 36 ++-- .../com/hbm/items/machine/ItemRBMKRod.java | 175 ++++++++++-------- src/main/java/com/hbm/main/NEIRegistry.java | 2 + 6 files changed, 251 insertions(+), 99 deletions(-) create mode 100644 src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java create mode 100644 src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java diff --git a/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java new file mode 100644 index 000000000..fe92ebec5 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java @@ -0,0 +1,85 @@ +package com.hbm.handler.nei; + +import java.util.HashMap; + +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.machine.ItemRBMKRod; + +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class RBMKRodDisassemblyHandler extends NEIUniversalHandler { + + public RBMKRodDisassemblyHandler() { + super("RBMK Rod Disassembly", Blocks.crafting_table, getRecipes()); + } + + @Override + public String getKey() { + return "ntmRBMKDisassembly"; + } + + public static HashMap getRecipes() { + HashMap map = new HashMap<>(); + + for(ItemRBMKRod rod : ItemRBMKRod.craftableRods) { + for(int enrichment = 0; enrichment <= 4; enrichment++) { + ItemStack result = new ItemStack(rod.pellet, 8, enrichment); + map.put(new ComparableStackHeat(rod, false, enrichment, false), result); + + if(rod.pellet.isXenonEnabled()) { + ItemStack resultPoison = new ItemStack(rod.pellet, 8, enrichment + 5); + map.put(new ComparableStackHeat(rod, false, enrichment, true), resultPoison); + } + } + } + + return map; + } + + public static class ComparableStackHeat extends ComparableStack { + + // I was going to filter by these, but found it is just best to show all possible recipes for everything but heat + // that and... I'm actually stumped on how to filter by NBT, seeing as both `isApplicable` and `matchesRecipe` don't seem to work + private final boolean matchHot; + private final int matchEnrichment; + private final boolean matchPoison; + + public ComparableStackHeat(Item item, boolean matchHot) { + this(item, matchHot, -1, false); + } + + public ComparableStackHeat(Item item, boolean matchHot, int matchEnrichment, boolean matchPoison) { + super(item); + this.matchHot = matchHot; + this.matchEnrichment = matchEnrichment; + this.matchPoison = matchPoison; + } + + public ItemStack toStack() { + ItemStack stack = super.toStack(); + ItemRBMKRod rod = (ItemRBMKRod) stack.getItem(); + if(matchEnrichment >= 0) { + ItemRBMKRod.setYield(stack, Math.max(1 - ((double) matchEnrichment) / 5, 0.05) * rod.yield); + } else { + ItemRBMKRod.setYield(stack, 0.2 * rod.yield); + } + if(matchPoison) ItemRBMKRod.setPoison(stack, 50); + if(!matchHot) return stack; + ItemRBMKRod.setCoreHeat(stack, 100); + ItemRBMKRod.setHullHeat(stack, 50); + return stack; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + matchEnrichment; + result = prime * result + (matchPoison ? 1 : 0); + return result; + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java b/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java new file mode 100644 index 000000000..9be5a6ae2 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/RBMKWasteDecayHandler.java @@ -0,0 +1,40 @@ +package com.hbm.handler.nei; + +import java.util.HashMap; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.items.special.ItemWasteLong; +import com.hbm.items.special.ItemWasteShort; + +import net.minecraft.item.ItemStack; + +public class RBMKWasteDecayHandler extends NEIUniversalHandler { + + public RBMKWasteDecayHandler() { + super("Nuclear Waste Decay", ModBlocks.machine_storage_drum, getRecipes()); + } + + @Override + public String getKey() { + return "ntmRBMKWaste"; + } + + public static HashMap getRecipes() { + HashMap map = new HashMap<>(); + + for(ItemWasteShort.WasteClass waste : ItemWasteShort.WasteClass.values()) { + map.put(new ComparableStack(ModItems.nuclear_waste_short, 1, waste), new ItemStack(ModItems.nuclear_waste_short_depleted, 1, waste.ordinal())); + map.put(new ComparableStack(ModItems.nuclear_waste_short_tiny, 1, waste), new ItemStack(ModItems.nuclear_waste_short_depleted_tiny, 1, waste.ordinal())); + } + + for(ItemWasteLong.WasteClass waste : ItemWasteLong.WasteClass.values()) { + map.put(new ComparableStack(ModItems.nuclear_waste_long, 1, waste), new ItemStack(ModItems.nuclear_waste_long_depleted, 1, waste.ordinal())); + map.put(new ComparableStack(ModItems.nuclear_waste_long_tiny, 1, waste), new ItemStack(ModItems.nuclear_waste_long_depleted_tiny, 1, waste.ordinal())); + } + + return map; + } + +} diff --git a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java index 9f01c9d80..12bf21f4e 100644 --- a/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/FuelPoolRecipes.java @@ -8,15 +8,17 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.handler.nei.RBMKRodDisassemblyHandler; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; +import com.hbm.items.machine.ItemRBMKRod; import net.minecraft.item.ItemStack; public class FuelPoolRecipes extends SerializableRecipe { - + public static final HashMap recipes = new HashMap(); public static final FuelPoolRecipes instance = new FuelPoolRecipes(); @@ -38,8 +40,14 @@ public class FuelPoolRecipes extends SerializableRecipe { recipes.put(new ComparableStack(ModItems.waste_plate_sa326, 1, 1), new ItemStack(ModItems.waste_plate_sa326)); recipes.put(new ComparableStack(ModItems.waste_plate_ra226be, 1, 1), new ItemStack(ModItems.waste_plate_ra226be)); recipes.put(new ComparableStack(ModItems.waste_plate_pu238be, 1, 1), new ItemStack(ModItems.waste_plate_pu238be)); - + for(EnumPWRFuel pwr : EnumPWRFuel.values()) recipes.put(new ComparableStack(ModItems.pwr_fuel_hot, 1, pwr.ordinal()), new ItemStack(ModItems.pwr_fuel_depleted, 1, pwr.ordinal())); + + for(ItemRBMKRod rod : ItemRBMKRod.craftableRods) { + ItemStack result = new ItemStack(rod); + ItemRBMKRod.setYield(result, 0.2 * rod.yield); + recipes.put(new RBMKRodDisassemblyHandler.ComparableStackHeat(rod, true), result); + } } @Override diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java b/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java index e50dbcd66..2b252f2ff 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKPellet.java @@ -16,7 +16,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; public class ItemRBMKPellet extends ItemNuclearWaste { - + public String fullName = ""; protected boolean hasXenon = true; @@ -26,12 +26,16 @@ public class ItemRBMKPellet extends ItemNuclearWaste { this.setMaxDamage(0); this.setCreativeTab(MainRegistry.controlTab); } - + public ItemRBMKPellet disableXenon() { this.hasXenon = false; return this; } + public boolean isXenonEnabled() { + return hasXenon; + } + @Override @SideOnly(Side.CLIENT) public void getSubItems(Item item, CreativeTabs tabs, List list) { @@ -39,10 +43,10 @@ public class ItemRBMKPellet extends ItemNuclearWaste { list.add(new ItemStack(item, 1, i)); } } - + @SideOnly(Side.CLIENT) private IIcon[] enrichmentOverlays; - + @SideOnly(Side.CLIENT) private IIcon xenonOverlay; @@ -50,13 +54,13 @@ public class ItemRBMKPellet extends ItemNuclearWaste { @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister iconRegister) { super.registerIcons(iconRegister); - + this.enrichmentOverlays = new IIcon[5]; - + for(int i = 0; i < enrichmentOverlays.length; i++) { enrichmentOverlays[i] = iconRegister.registerIcon("hbm:rbmk_pellet_overlay_e" + i); } - + if(this.hasXenon) xenonOverlay = iconRegister.registerIcon("hbm:rbmk_pellet_overlay_xenon"); } @@ -71,16 +75,16 @@ public class ItemRBMKPellet extends ItemNuclearWaste { public int getRenderPasses(int meta) { return hasXenon(meta) ? 3 : 2; } - + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { super.addInformation(stack, player, list, bool); list.add(EnumChatFormatting.ITALIC + this.fullName); list.add(EnumChatFormatting.DARK_GRAY + "" + EnumChatFormatting.ITALIC + "Pellet for recycling"); - + int meta = rectify(stack.getItemDamage()); - + switch(meta % 5) { case 0: list.add(EnumChatFormatting.GOLD + "Brand New"); break; case 1: list.add(EnumChatFormatting.YELLOW + "Barely Depleted"); break; @@ -88,7 +92,7 @@ public class ItemRBMKPellet extends ItemNuclearWaste { case 3: list.add(EnumChatFormatting.DARK_GREEN + "Highly Depleted"); break; case 4: list.add(EnumChatFormatting.DARK_GRAY + "Fully Depleted"); break; } - + if(hasXenon(meta)) list.add(EnumChatFormatting.DARK_PURPLE + "High Xenon Poison"); } @@ -96,20 +100,20 @@ public class ItemRBMKPellet extends ItemNuclearWaste { @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamageForRenderPass(int meta, int pass) { - + if(pass == 0) return this.itemIcon; - + if(pass == 2) return this.xenonOverlay; - + return this.enrichmentOverlays[rectify(meta) % 5]; } - + public static boolean hasXenon(int meta) { return rectify(meta) >= 5; } - + public static int rectify(int meta) { return Math.abs(meta) % 10; } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 895c788c6..2b0fd0e98 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -1,5 +1,6 @@ package com.hbm.items.machine; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.function.BiFunction; @@ -20,7 +21,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class ItemRBMKRod extends Item { - + public ItemRBMKPellet pellet; public String fullName = ""; //full name of the fuel rod public double reactivity; //endpoint of the function @@ -35,7 +36,7 @@ public class ItemRBMKRod extends Item { public double diffusion = 0.02D; //the speed at which the core heats the hull public NType nType = NType.SLOW; //neutronType, the most efficient neutron type for fission public NType rType = NType.FAST; //releaseType, the type of neutrons released by this fuel - + /* _____ * ,I I I I, * |'-----'| @@ -52,18 +53,22 @@ public class ItemRBMKRod extends Item { * | | * '-----' * I I I I - * + * * i drew a fuel rod yay */ + public static List craftableRods = new ArrayList<>(); + public ItemRBMKRod(ItemRBMKPellet pellet) { this(pellet.fullName); this.pellet = pellet; + + craftableRods.add(this); } public ItemRBMKRod(String fullName) { this.fullName = fullName; - + this.setContainerItem(ModItems.rbmk_fuel_empty); this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.controlTab); @@ -93,7 +98,7 @@ public class ItemRBMKRod extends Item { this.depFunc = func; return this; } - + public ItemRBMKRod setXenon(double gen, double burn) { this.xGen = gen; this.xBurn = burn; @@ -120,7 +125,7 @@ public class ItemRBMKRod extends Item { this.rType = rType; return this; } - + /** * Adjusts the input flux using the poison level * Generates, then burns poison @@ -131,82 +136,82 @@ public class ItemRBMKRod extends Item { * @return outFlux */ public double burn(World world, ItemStack stack, double inFlux) { - + inFlux += selfRate; - + //if xenon poison is enabled if(RBMKDials.getXenon(world)) { double xenon = getPoison(stack); xenon -= xenonBurnFunc(inFlux); - + inFlux *= (1D - getPoisonLevel(stack)); - + xenon += xenonGenFunc(inFlux); - + if(xenon < 0D) xenon = 0D; if(xenon > 100D) xenon = 100D; - + setPoison(stack, xenon); } - + double outFlux = reactivityFunc(inFlux, getEnrichment(stack)) * RBMKDials.getReactivityMod(world); //if depletion is enabled if(RBMKDials.getDepletion(world)) { double y = getYield(stack); y -= inFlux; - + if(y < 0D) y = 0D; - + setYield(stack, y); } - + double coreHeat = this.getCoreHeat(stack); coreHeat += outFlux * heat; - + this.setCoreHeat(stack, rectify(coreHeat)); - + return outFlux; } - + private double rectify(double num) { - + if(num > 1_000_000D) num = 1_000_000D; if(num < 20D || Double.isNaN(num)) num = 20D; - + return num; } - + /** * Heat up the core based on the outFlux, then move some heat to the hull * @param stack */ public void updateHeat(World world, ItemStack stack, double mod) { - + double coreHeat = this.getCoreHeat(stack); double hullHeat = this.getHullHeat(stack); - + if(coreHeat > hullHeat) { - + double mid = (coreHeat - hullHeat) / 2D; - + coreHeat -= mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; hullHeat += mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; - + this.setCoreHeat(stack, rectify(coreHeat)); this.setHullHeat(stack, rectify(hullHeat)); } } - + /** * return one tick's worth of heat and cool the hull of the fuel rod, this heat goes into the fuel rod assembly block * @param stack * @return */ public double provideHeat(World world, ItemStack stack, double heat, double mod) { - + double hullHeat = this.getHullHeat(stack); - + //metldown! the hull melts so the entire structure stops making sense //hull and core heats are instantly equalized into 33% of their sum each, //the rest is sent to the component which is always fatal @@ -217,20 +222,20 @@ public class ItemRBMKRod extends Item { this.setHullHeat(stack, avg); return avg - heat; } - + if(hullHeat <= heat) return 0; - + double ret = (hullHeat - heat) / 2; - + ret *= RBMKDials.getFuelHeatProvision(world) * mod; - + hullHeat -= ret; this.setHullHeat(stack, hullHeat); - + return ret; } - + public static enum EnumBurnFunc { PASSIVE(EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"), //const, no reactivity LOG_TEN(EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"), //log10(x + 1) * reactivity * 50 @@ -241,22 +246,22 @@ public class ItemRBMKRod extends Item { LINEAR(EnumChatFormatting.RED + "DANGEROUS / LINEAR"), //x * reactivity QUADRATIC(EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"), //x^2 / 100 * reactivity EXPERIMENTAL(EnumChatFormatting.RED + "EXPERIMENTAL / SINE SLOPE"); //x * (sin(x) + 1) - + public String title = ""; - + private EnumBurnFunc(String title) { this.title = title; } } - + /** * @param enrichment [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double in, double enrichment) { - + double flux = in * reactivityModByEnrichment(enrichment); - + switch(this.function) { case PASSIVE: return selfRate * enrichment; case LOG_TEN: return Math.log10(flux + 1) * 0.5D * reactivity; @@ -268,14 +273,14 @@ public class ItemRBMKRod extends Item { case QUADRATIC: return flux * flux / 10000D * reactivity; case EXPERIMENTAL: return flux * (Math.sin(flux) + 1) * reactivity; } - + return 0; } - + public String getFuncDescription(ItemStack stack) { - + String function; - + switch(this.function) { case PASSIVE: function = EnumChatFormatting.RED + "" + selfRate; break; @@ -297,20 +302,20 @@ public class ItemRBMKRod extends Item { break; default: function = "ERROR"; } - + double enrichment = getEnrichment(stack); - + if(enrichment < 1) { enrichment = reactivityModByEnrichment(enrichment); String reactivity = EnumChatFormatting.YELLOW + "" + ((int)(this.reactivity * enrichment * 1000D) / 1000D) + EnumChatFormatting.WHITE; String enrichmentPer = EnumChatFormatting.GOLD + " (" + ((int)(enrichment * 1000D) / 10D) + "%)"; - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity).concat(enrichmentPer); } - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity); } - + public static enum EnumDepleteFunc { LINEAR, //old function RAISING_SLOPE, //for breeding fuels such as MEU, maximum of 110% at 28% depletion @@ -318,9 +323,9 @@ public class ItemRBMKRod extends Item { GENTLE_SLOPE, //recommended for most fuels, maximum barely over the start, near the beginning STATIC; //for arcade-style neutron sources } - + public double reactivityModByEnrichment(double enrichment) { - + switch(this.depFunc) { default: case LINEAR: return enrichment; @@ -330,7 +335,7 @@ public class ItemRBMKRod extends Item { case GENTLE_SLOPE: return enrichment + (Math.sin(enrichment * Math.PI) / 3D); //x + (sin(x * pi) / 3) also works } } - + /** * Xenon generated per tick, linear function * @param flux @@ -339,7 +344,7 @@ public class ItemRBMKRod extends Item { public double xenonGenFunc(double flux) { return flux * xGen; } - + /** * Xenon burned away per tick, quadratic function * @param flux @@ -348,7 +353,7 @@ public class ItemRBMKRod extends Item { public double xenonBurnFunc(double flux) { return (flux * flux) / xBurn; } - + /** * @param stack * @return enrichment [0;1] @@ -356,7 +361,7 @@ public class ItemRBMKRod extends Item { public static double getEnrichment(ItemStack stack) { return getYield(stack) / ((ItemRBMKRod) stack.getItem()).yield; } - + /** * @param stack * @return poison [0;1] @@ -415,15 +420,19 @@ public class ItemRBMKRod extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + list.add(EnumChatFormatting.ITALIC + this.fullName); - + if(this == ModItems.rbmk_fuel_drx) { - + + if(ItemRBMKRod.getHullHeat(stack) >= 50 && ItemRBMKRod.getCoreHeat(stack) >= 50) { + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); + } + if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmx.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmx.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmx.splitsWith", I18nUtil.resolveKey(nType.unlocalized + ".x"))); @@ -437,13 +446,17 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmx.melt", meltingPoint + "m")); - + } else { + if(ItemRBMKRod.getHullHeat(stack) >= 50 && ItemRBMKRod.getCoreHeat(stack) >= 50) { + list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); + } + if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmk.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000D)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmk.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmk.splitsWith", I18nUtil.resolveKey(nType.unlocalized))); @@ -471,10 +484,10 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + "Skin temp: " + ((int)(getHullHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.RED + "Core temp: " + ((int)(getCoreHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.DARK_RED + "Melting point: " + meltingPoint + "°C");*/ - + super.addInformation(stack, player, list, bool); } - + /* __ __ ____ ________ * | \ | | | __ \ |__ __| * | \ | | | |__| | | | @@ -482,40 +495,40 @@ public class ItemRBMKRod extends Item { * | | \ | | |__| | | | * |__| \__| |_____/ |__| */ - + public static void setYield(ItemStack stack, double yield) { setDouble(stack, "yield", yield); } - + public static double getYield(ItemStack stack) { - + if(stack.getItem() instanceof ItemRBMKRod) { return getDouble(stack, "yield"); } - + return 0; } - + public static void setPoison(ItemStack stack, double xenon) { setDouble(stack, "xenon", xenon); } - + public static double getPoison(ItemStack stack) { return getDouble(stack, "xenon"); } - + public static void setCoreHeat(ItemStack stack, double heat) { setDouble(stack, "core", heat); } - + public static double getCoreHeat(ItemStack stack) { return getDouble(stack, "core"); } - + public static void setHullHeat(ItemStack stack, double heat) { setDouble(stack, "hull", heat); } - + public static double getHullHeat(ItemStack stack) { return getDouble(stack, "hull"); } @@ -529,23 +542,23 @@ public class ItemRBMKRod extends Item { public double getDurabilityForDisplay(ItemStack stack) { return 1D - getEnrichment(stack); } - + public static void setDouble(ItemStack stack, String key, double yield) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); - + stack.stackTagCompound.setDouble(key, yield); } - + public static double getDouble(ItemStack stack, String key) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); return stack.stackTagCompound.getDouble(key); } - + /** * Sets up the default values for all NBT data because doing it one-by-one will only correctly set the first called value and the rest stays 0 which is very not good * @param stack @@ -557,7 +570,7 @@ public class ItemRBMKRod extends Item { setCoreHeat(stack, 20.0D); setHullHeat(stack, 20.0D); } - + @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { setNBTDefaults(stack); //minimize the window where NBT screwups can happen diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 12d7101c7..a7f6b916b 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -38,6 +38,8 @@ public class NEIRegistry { handlers.add(new FusionRecipeHandler()); handlers.add(new SILEXRecipeHandler()); handlers.add(new FuelPoolHandler()); + handlers.add(new RBMKRodDisassemblyHandler()); + handlers.add(new RBMKWasteDecayHandler()); handlers.add(new CrucibleSmeltingHandler()); handlers.add(new CrucibleAlloyingHandler()); handlers.add(new CrucibleCastingHandler()); From b90741f6403e18c5861e709c2940a0fbc903ad6d Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 25 Mar 2025 15:48:29 +0100 Subject: [PATCH 23/32] you've creeked your last flow, pardner --- README.md | 2 +- changelog | 15 +++-------- .../java/com/hbm/crafting/ToolRecipes.java | 13 ---------- .../inventory/recipes/AssemblerRecipes.java | 1 - src/main/java/com/hbm/items/ModItems.java | 13 ++++------ .../weapon/sedna/factory/XFactory75Bolt.java | 24 +++++++++++++++--- .../java/com/hbm/main/CraftingManager.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 3 ++- .../java/com/hbm/main/ModEventHandler.java | 4 +-- .../textures/items/assembly_template_alt.png | Bin 242 -> 0 bytes .../assets/hbm/textures/items/ln2_1.png | Bin 142 -> 0 bytes .../assets/hbm/textures/items/ln2_10.png | Bin 334 -> 0 bytes .../assets/hbm/textures/items/ln2_2.png | Bin 152 -> 0 bytes .../assets/hbm/textures/items/ln2_3.png | Bin 239 -> 0 bytes .../assets/hbm/textures/items/ln2_4.png | Bin 237 -> 0 bytes .../assets/hbm/textures/items/ln2_5.png | Bin 259 -> 0 bytes .../assets/hbm/textures/items/ln2_6.png | Bin 356 -> 0 bytes .../assets/hbm/textures/items/ln2_7.png | Bin 404 -> 0 bytes .../assets/hbm/textures/items/ln2_8.png | Bin 409 -> 0 bytes .../assets/hbm/textures/items/ln2_9.png | Bin 399 -> 0 bytes .../hbm/textures/items/magnet_circular.png | Bin 240 -> 0 bytes .../assets/hbm/textures/items/magnet_dee.png | Bin 297 -> 0 bytes .../assets/hbm/textures/items/magnetron.png | Bin 285 -> 0 bytes .../hbm/textures/items/nugget_daffergon.png | Bin 194 -> 0 bytes .../hbm/textures/items/nugget_reiium.png | Bin 180 -> 0 bytes .../hbm/textures/items/nugget_u238m2.png | Bin 206 -> 0 bytes .../hbm/textures/items/nugget_unobtainium.png | Bin 178 -> 0 bytes .../hbm/textures/items/nugget_verticium.png | Bin 176 -> 0 bytes .../hbm/textures/items/nugget_weidanium.png | Bin 189 -> 0 bytes .../hbm/textures/items/pellets_canister.png | Bin 355 -> 0 bytes .../textures/items/pellets_chlorophyte.png | Bin 205 -> 0 bytes .../hbm/textures/items/pellets_claws.png | Bin 216 -> 0 bytes .../hbm/textures/items/pellets_flechette.png | Bin 257 -> 0 bytes .../assets/hbm/textures/items/pill_salt.png | Bin 318 -> 0 bytes .../assets/hbm/textures/items/pill_zinc.png | Bin 317 -> 0 bytes .../assets/hbm/textures/items/pipe_lead.png | Bin 493 -> 253 bytes .../assets/hbm/textures/items/pirfenidone.png | Bin 370 -> 0 bytes .../hbm/textures/items/powder_daffergon.png | Bin 307 -> 0 bytes .../hbm/textures/items/powder_reiium.png | Bin 334 -> 0 bytes .../hbm/textures/items/powder_unobtainium.png | Bin 357 -> 0 bytes .../hbm/textures/items/powder_verticium.png | Bin 340 -> 0 bytes .../hbm/textures/items/powder_weidanium.png | Bin 370 -> 0 bytes .../hbm/textures/items/ring_starmetal_alt.png | Bin 385 -> 0 bytes .../hbm/textures/items/singularity_2.png | Bin 753 -> 0 bytes .../hbm/textures/items/singularity_3.png | Bin 710 -> 0 bytes .../hbm/textures/items/singularity_micro.png | Bin 251 -> 0 bytes .../hbm/textures/items/singularity_spark.png | Bin 808 -> 0 bytes .../textures/items/singularity_special.png | Bin 812 -> 0 bytes 48 files changed, 35 insertions(+), 42 deletions(-) delete mode 100644 src/main/resources/assets/hbm/textures/items/assembly_template_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_1.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_10.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_2.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_3.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_4.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_5.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_6.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_7.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_8.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ln2_9.png delete mode 100644 src/main/resources/assets/hbm/textures/items/magnet_circular.png delete mode 100644 src/main/resources/assets/hbm/textures/items/magnet_dee.png delete mode 100644 src/main/resources/assets/hbm/textures/items/magnetron.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_daffergon.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_reiium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_u238m2.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_unobtainium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_verticium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/nugget_weidanium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pellets_canister.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pellets_claws.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pellets_flechette.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pill_salt.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pill_zinc.png delete mode 100644 src/main/resources/assets/hbm/textures/items/pirfenidone.png delete mode 100644 src/main/resources/assets/hbm/textures/items/powder_daffergon.png delete mode 100644 src/main/resources/assets/hbm/textures/items/powder_reiium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/powder_unobtainium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/powder_verticium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/powder_weidanium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/items/singularity_2.png delete mode 100644 src/main/resources/assets/hbm/textures/items/singularity_3.png delete mode 100644 src/main/resources/assets/hbm/textures/items/singularity_micro.png delete mode 100644 src/main/resources/assets/hbm/textures/items/singularity_spark.png delete mode 100644 src/main/resources/assets/hbm/textures/items/singularity_special.png diff --git a/README.md b/README.md index f86803200..db2e42f5b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ * NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases * NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases -* NTM WarFactory: https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-GIT/releases +* NTM Community Edition (WarFactory): https://codeberg.org/MrNorwood/Hbm-s-Nuclear-Tech-CE For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases diff --git a/changelog b/changelog index a9ca40d00..299a12998 100644 --- a/changelog +++ b/changelog @@ -1,12 +1,5 @@ ## Changed -* The toolbox' functionality has been completely changed (thanks gamma) - * Instead of a crappy backpack substitute that doesn't work half the time, the toolbox can quickly swap out the hotbar when used -* Updated StG 77 recipe to use two grips and a proper scope -* Buffed the RPA set -* Tiered damage and durability weapon mods are now craftable -* Duct tape is now cheaper and less ugly - -## Fixed -* Fixed a bunch of singleblocks not accepting fluids (thanks mellow) -* Fixed fluid valves not properly disconnecting -* Fixed a dupe regarding the weapon mod table +* .75 bolts now work as advertised +* Updated lead pipe texture +* Removed recipes from a few ancient melee weapons, as well as the creative tab listing +* Removed flat magnets \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 84c9df2a6..4399f08c3 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -108,11 +108,6 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.lead_gavel, 1), new Object[] { "PIP", "IGI", "PIP", 'P', ModItems.pellet_buckshot, 'I', PB.ingot(), 'G', ModItems.wood_gavel }); //Misc weapons - CraftingManager.addRecipeAuto(new ItemStack(ModItems.saw, 1), new Object[] { "IIL", "PP ", 'P', STEEL.plate(), 'I', STEEL.ingot(), 'L', Items.leather }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bat, 1), new Object[] { "P", "P", "S", 'S', STEEL.plate(), 'P', KEY_PLANKS }); - CraftingManager.addShapelessAuto(new ItemStack(ModItems.bat_nail, 1), new Object[] { ModItems.bat, STEEL.plate() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.golf_club, 1), new Object[] { "IP", " P", " P", 'P', STEEL.plate(), 'I', STEEL.ingot() }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipe_rusty, 1), new Object[] { "II", " I", " I", 'I', IRON.pipe() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.pipe_lead, 1), new Object[] { "II", " I", " I", 'I', PB.pipe() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.ullapool_caber, 1), new Object[] { "ITI", " S ", " S ", 'I', IRON.plate(), 'T', Blocks.tnt, 'S', KEY_STICK }); @@ -197,14 +192,6 @@ public class ToolRecipes { addShovel( SA326.ingot(), ModItems.schrabidium_shovel); addHoe( SA326.ingot(), ModItems.schrabidium_hoe); } else { - /* - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_sword, 1), new Object[] { " I ", " I ", "SBS", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_sword }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_pickaxe, 1), new Object[] { "III", " B ", " S ", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_pickaxe }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_axe, 1), new Object[] { "II", "IB", " S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_axe }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_shovel, 1), new Object[] { "I", "B", "S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_shovel }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.cobalt_decorated_hoe, 1), new Object[] { "II", " B", " S", 'I', CO.ingot(), 'S', ModItems.ingot_meteorite_forged, 'B', ModItems.cobalt_hoe }); - - */ CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_sword, 1), new Object[] { " I ", " B ", "ISI", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_sword }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_pickaxe, 1), new Object[] { "ISI", " B ", " I ", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_pickaxe }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.starmetal_axe, 1), new Object[] { "IS", "IB", " I", 'I', STAR.ingot(), 'S', ModItems.ring_starmetal, 'B', ModItems.cobalt_decorated_axe }); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index c1949152a..e4e576ef2 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -74,7 +74,6 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModItems.asbestos_cloth, 4), new AStack[] {new OreDictStack(ASBESTOS.ingot(), 2), new ComparableStack(Items.string, 6), new ComparableStack(Blocks.wool, 1), },50); makeRecipe(new ComparableStack(ModItems.filter_coal, 1), new AStack[] {new OreDictStack(COAL.dust(), 4), new ComparableStack(Items.string, 2), new ComparableStack(Items.paper, 1), },50); makeRecipe(new ComparableStack(ModItems.centrifuge_element, 1), new AStack[] {new OreDictStack(STEEL.plate528(), 4), new OreDictStack(TI.plate528(), 4), new ComparableStack(ModItems.motor, 1), }, 100); - makeRecipe(new ComparableStack(ModItems.magnet_circular, 1), new AStack[] {new ComparableStack(ModBlocks.fusion_conductor, 5), new OreDictStack(STEEL.ingot(), 4), new OreDictStack(ALLOY.plate(), 6), },150); makeRecipe(new ComparableStack(ModItems.reactor_core, 1), new AStack[] {new OreDictStack(PB.ingot(), 8), new OreDictStack(BE.ingot(), 6), new OreDictStack(STEEL.plate(), 16), new OreDictStack(OreDictManager.getReflector(), 8), new OreDictStack(FIBER.ingot(), 2) },100); makeRecipe(new ComparableStack(ModItems.rtg_unit, 1), new AStack[] {new ComparableStack(ModItems.thermo_element, 2), new OreDictStack(CU.plateCast(), 1), new OreDictStack(PB.ingot(), 2), new OreDictStack(STEEL.plate(), 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.CAPACITOR.ordinal()), },100); makeRecipe(new ComparableStack(ModItems.levitation_unit, 1), new AStack[] {new ComparableStack(ModItems.coil_copper, 4), new ComparableStack(ModItems.coil_tungsten, 2), new OreDictStack(TI.plate(), 6), new ComparableStack(ModItems.nugget_schrabidium, 2), },100); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 694b18910..b712e47a4 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -570,7 +570,6 @@ public class ModItems { public static Item coil_magnetized_tungsten; public static Item coil_gold; public static Item coil_gold_torus; - public static Item magnet_circular; public static Item component_limiter; public static Item component_emitter; public static Item chlorine_pinwheel; @@ -2747,7 +2746,6 @@ public class ModItems { coil_magnetized_tungsten = new Item().setUnlocalizedName("coil_magnetized_tungsten").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_magnetized_tungsten"); coil_gold = new Item().setUnlocalizedName("coil_gold").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold"); coil_gold_torus = new Item().setUnlocalizedName("coil_gold_torus").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":coil_gold_torus"); - magnet_circular = new Item().setUnlocalizedName("magnet_circular").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":magnet_circular"); component_limiter = new Item().setUnlocalizedName("component_limiter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_limiter"); component_emitter = new Item().setUnlocalizedName("component_emitter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":component_emitter"); chlorine_pinwheel = new ItemInfiniteFluid(Fluids.CHLORINE, 1, 2).setUnlocalizedName("chlorine_pinwheel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":chlorine_pinwheel"); @@ -4940,11 +4938,11 @@ public class ModItems { multitool_joule = new ItemMultitoolPassive().setUnlocalizedName("multitool_joule").setCreativeTab(null).setTextureName(RefStrings.MODID + ":multitool_fist"); multitool_decon = new ItemMultitoolPassive().setUnlocalizedName("multitool_decon").setCreativeTab(null).setTextureName(RefStrings.MODID + ":multitool_fist"); - saw = new ModSword(MainRegistry.enumToolMaterialSaw).setUnlocalizedName("weapon_saw").setFull3D().setTextureName(RefStrings.MODID + ":saw"); - bat = new ModSword(MainRegistry.enumToolMaterialBat).setUnlocalizedName("weapon_bat").setFull3D().setTextureName(RefStrings.MODID + ":bat"); - bat_nail = new ModSword(MainRegistry.enumToolMaterialBatNail).setUnlocalizedName("weapon_bat_nail").setFull3D().setTextureName(RefStrings.MODID + ":bat_nail"); - golf_club = new ModSword(MainRegistry.enumToolMaterialGolfClub).setUnlocalizedName("weapon_golf_club").setFull3D().setTextureName(RefStrings.MODID + ":golf_club"); - pipe_rusty = new ModSword(MainRegistry.enumToolMaterialPipeRusty).setUnlocalizedName("weapon_pipe_rusty").setFull3D().setTextureName(RefStrings.MODID + ":pipe_rusty"); + saw = new ModSword(MainRegistry.enumToolMaterialSaw).setUnlocalizedName("weapon_saw").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":saw"); + bat = new ModSword(MainRegistry.enumToolMaterialBat).setUnlocalizedName("weapon_bat").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":bat"); + bat_nail = new ModSword(MainRegistry.enumToolMaterialBatNail).setUnlocalizedName("weapon_bat_nail").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":bat_nail"); + golf_club = new ModSword(MainRegistry.enumToolMaterialGolfClub).setUnlocalizedName("weapon_golf_club").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":golf_club"); + pipe_rusty = new ModSword(MainRegistry.enumToolMaterialPipeRusty).setUnlocalizedName("weapon_pipe_rusty").setCreativeTab(null).setFull3D().setTextureName(RefStrings.MODID + ":pipe_rusty"); pipe_lead = new ModSword(MainRegistry.enumToolMaterialPipeLead).setUnlocalizedName("weapon_pipe_lead").setFull3D().setTextureName(RefStrings.MODID + ":pipe_lead"); reer_graar = new ModSword(MainRegistry.tMatTitan).setUnlocalizedName("reer_graar").setFull3D().setTextureName(RefStrings.MODID + ":reer_graar_hd"); stopsign = new WeaponSpecial(MainRegistry.tMatAlloy).setUnlocalizedName("stopsign").setTextureName(RefStrings.MODID + ":stopsign"); @@ -5562,7 +5560,6 @@ public class ModItems { GameRegistry.registerItem(motor_desh, motor_desh.getUnlocalizedName()); GameRegistry.registerItem(motor_bismuth, motor_bismuth.getUnlocalizedName()); GameRegistry.registerItem(centrifuge_element, centrifuge_element.getUnlocalizedName()); - GameRegistry.registerItem(magnet_circular, magnet_circular.getUnlocalizedName()); GameRegistry.registerItem(reactor_core, reactor_core.getUnlocalizedName()); GameRegistry.registerItem(rtg_unit, rtg_unit.getUnlocalizedName()); GameRegistry.registerItem(levitation_unit, levitation_unit.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java index 92d47c361..1638a2794 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory75Bolt.java @@ -3,6 +3,8 @@ package com.hbm.items.weapon.sedna.factory; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import com.hbm.entity.projectile.EntityBulletBaseMK4; +import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.items.weapon.sedna.BulletConfig; import com.hbm.items.weapon.sedna.Crosshair; @@ -19,7 +21,9 @@ import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; public class XFactory75Bolt { @@ -27,15 +31,29 @@ public class XFactory75Bolt { public static BulletConfig b75_inc; public static BulletConfig b75_exp; + public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { + if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; + Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + }; + public static BiConsumer LAMBDA_INC = (bullet, mop) -> { + if(mop.entityHit != null && mop.entityHit instanceof EntityLivingBase) { + HbmLivingProps data = HbmLivingProps.getData((EntityLivingBase) mop.entityHit); + if(data.phosphorus < 300) data.phosphorus = 300; + } + }; + public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { + Lego.standardExplode(bullet, mop, 5F); bullet.setDead(); + }; + public static void init() { SpentCasing casing75 = new SpentCasing(CasingType.STRAIGHT).setColor(SpentCasing.COLOR_CASE_BRASS).setScale(2F, 2F, 1.5F); b75 = new BulletConfig().setItem(EnumAmmo.B75) - .setCasing(casing75.clone().register("b75")); + .setCasing(casing75.clone().register("b75")).setOnImpact(LAMBDA_TINY_EXPLODE); b75_inc = new BulletConfig().setItem(EnumAmmo.B75_INC).setDamage(0.8F).setArmorPiercing(0.1F) - .setCasing(casing75.clone().register("b75inc")); + .setCasing(casing75.clone().register("b75inc")).setOnImpact(LAMBDA_INC); b75_exp = new BulletConfig().setItem(EnumAmmo.B75_EXP).setDamage(1.5F).setArmorPiercing(-0.25F) - .setCasing(casing75.clone().register("b75exp")); + .setCasing(casing75.clone().register("b75exp")).setOnImpact(LAMBDA_STANDARD_EXPLODE); ModItems.gun_bolter = new ItemGunBaseNT(WeaponQuality.SPECIAL, new GunConfig() .dura(3_000).draw(20).inspect(31).crosshair(Crosshair.L_CIRCLE).smoke(LAMBDA_SMOKE) diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index ff321331f..452d1cbe7 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -740,7 +740,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.dfc_emitter, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModBlocks.machine_transformer_dnt, 'X', ModItems.crystal_xen, 'L', ModItems.sat_head_laser }); addRecipeAuto(new ItemStack(ModBlocks.dfc_receiver, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModBlocks.machine_transformer_dnt, 'X', ModBlocks.block_dineutronium, 'L', STEEL.shell() }); addRecipeAuto(new ItemStack(ModBlocks.dfc_injector, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', CMB.plate(), 'T', ModBlocks.machine_fluidtank, 'X', ModItems.motor, 'L', ModItems.pipes_steel }); - addRecipeAuto(new ItemStack(ModBlocks.dfc_stabilizer, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModItems.singularity_spark, 'X', ModItems.magnet_circular, 'L', ModItems.crystal_xen }); + addRecipeAuto(new ItemStack(ModBlocks.dfc_stabilizer, 1), new Object[] { "SDS", "TXL", "SDS", 'S', OSMIRIDIUM.plateWelded(), 'D', ModItems.plate_desh, 'T', ModItems.singularity_spark, 'X', ModBlocks.fusion_conductor, 'L', ModItems.crystal_xen }); addRecipeAuto(new ItemStack(ModBlocks.barrel_plastic, 1), new Object[] { "IPI", "I I", "IPI", 'I', ModItems.plate_polymer, 'P', AL.plate() }); addRecipeAuto(new ItemStack(ModBlocks.barrel_iron, 1), new Object[] { "IPI", "I I", "IPI", 'I', IRON.plate(), 'P', IRON.ingot() }); addShapelessAuto(new ItemStack(ModBlocks.barrel_iron, 1), new Object[] { ModBlocks.barrel_corroded, ANY_TAR.any() }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index dd4323118..8f7f53640 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -131,7 +131,7 @@ public class MainRegistry { public static ToolMaterial enumToolMaterialBatNail = EnumHelper.addToolMaterial("BATNAIL", 0, 450, 1.0F, 4F, 25); public static ToolMaterial enumToolMaterialGolfClub = EnumHelper.addToolMaterial("GOLFCLUB", 1, 1000, 2.0F, 5F, 25); public static ToolMaterial enumToolMaterialPipeRusty = EnumHelper.addToolMaterial("PIPERUSTY", 1, 350, 1.5F, 4.5F, 25); - public static ToolMaterial enumToolMaterialPipeLead = EnumHelper.addToolMaterial("PIPELEAD", 1, 250, 1.5F, 5.5F, 25); + public static ToolMaterial enumToolMaterialPipeLead = EnumHelper.addToolMaterial("PIPELEAD", 1, 250, 1.5F, 3F, 25); public static ToolMaterial enumToolMaterialBottleOpener = EnumHelper.addToolMaterial("OPENER", 1, 250, 1.5F, 0.5F, 200); public static ToolMaterial enumToolMaterialSledge = EnumHelper.addToolMaterial("SHIMMERSLEDGE", 1, 0, 25.0F, 26F, 200); @@ -1665,6 +1665,7 @@ public class MainRegistry { ignoreMappings.add("hbm:item.bobmazon_weapons"); ignoreMappings.add("hbm:item.bobmazon_tools"); ignoreMappings.add("hbm:item.missile_carrier"); + ignoreMappings.add("hbm:item.magnet_circular"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index bdba621ca..7415566d7 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -370,12 +370,10 @@ public class ModEventHandler { if(rand.nextInt(1024) == 0) entity.setCurrentItemOrArmor(3, new ItemStack(ModItems.starmetal_plate, 1, world.rand.nextInt(ModItems.starmetal_plate.getMaxDamage()))); - if(rand.nextInt(128) == 0) + if(rand.nextInt(64) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.pipe_lead, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.reer_graar, 1, world.rand.nextInt(100))); - if(rand.nextInt(128) == 0) - entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.pipe_rusty, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) entity.setCurrentItemOrArmor(0, new ItemStack(ModItems.crowbar, 1, world.rand.nextInt(100))); if(rand.nextInt(128) == 0) diff --git a/src/main/resources/assets/hbm/textures/items/assembly_template_alt.png b/src/main/resources/assets/hbm/textures/items/assembly_template_alt.png deleted file mode 100644 index 2537c2fc2885f9092bd2e8d68a5f0d66fa893c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfGj!TGg@ZmyD<~zM5D=bx^uRg210Oy=XW!9go`25RXT}7tIovmHvPxK4J3nMo zQx88F+n~eF++)C2C6REMq1dr%m+IkPUj_DRuXy}HQDFfwHe?nP=04c3&e>1qC&JB%rpoV@EN} z%zX6um3XX@=)HGF>L&zdYMsp8&U^r{xgu9}4b38ken zoHY{Kj%!0Sqv{uW6S{@bQXkRwI6uhs?4^iTcgg|98g0k9axUEutO;2k;E2{UF)0Ew zB5_|SSM^^4SBYlL#lXr05KJXvWy+FTCc=^{t24k$e?)jZ%SWvms5*jY_GeLMjH+?& g@726JcKmO=0DGgwlsH_e_W%F@07*qoM6N<$g4FMgeE7con`1dntil;tu9}{fgZ(szo%8q x+iX0~IfP~PXU-z#`?*_AKDanv!Sh!u`#Y`JnYIN6vw%i3c)I$ztaD0e0svLKGBW@G diff --git a/src/main/resources/assets/hbm/textures/items/ln2_3.png b/src/main/resources/assets/hbm/textures/items/ln2_3.png deleted file mode 100644 index 55b04d07a2aa3835dfc30baba775a76f0814b7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@|StKIEF;D zzMXQH^RNL=%X_cmncH64E&QD#&AY_rh}NMUs$HGTYxk+&PPqH>INKx@&wsMtV!}de z*_C!DwYKj45s+0FEpJ-d-xa-bX~)DRJ3eb{SDwz0ptQ5bK(cf5?X9W#GxZtbRGx3D zXR1h8-BA|uWObv}?wfCqo^?`r_fBj>0#i_@f1a3MwPM|)rHLsoE`L$0scxH*@t67V kk!Ux)-=dRMJnNc74;)!MIftn(0_b7}Pgg&ebxsLQ01xnAw*UYD diff --git a/src/main/resources/assets/hbm/textures/items/ln2_4.png b/src/main/resources/assets/hbm/textures/items/ln2_4.png deleted file mode 100644 index f33742080de98f3b085e168ce3fe70dcaee78e99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@|SqJIEF;D zzMT@u#casq?4J7WE%#S5%L%`pDm6LVc5^e=*_VmwsPf(1wk&g&y3-^%Q~O}<^rMUk z^L~p>-5UQU{78F`=cUEZ-LsY-we54&abAD(Xinmz6V(-|M;RUbGbim&eLo>A#ditM ziiUNO3MH#6LarSzQ|_H9P&8HX*@9DU`?8F`;6(?;LCNQ%dTeG2FcG?o%n21WBN6qFBm*s{an^L HB{Ts5$@p(b diff --git a/src/main/resources/assets/hbm/textures/items/ln2_6.png b/src/main/resources/assets/hbm/textures/items/ln2_6.png deleted file mode 100644 index 41256391aa8737005a5b0422e8c5e1b904fa5706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmV-q0h|7bP)Au?`$7b zWMN@p0A^-U9KmgbnAcQQM@4iAh=^ab=D1XVC-q95xB$^hL{wF!#+k7k$UQnCM@O-K zZ|E;_ud0|?QdJ~<*7&FqpKnM~b95t`DGJDR%^mR^EslGOT;!v^K=P!jPQ25#kcdqt zsz>0=bNz`NI}jDoyDJU}*lLP?@$3}LbkE;T0~48jyE{6PFKd5GOhkyr zyPO!wqp`rq=Uv|`f}izb=zwrC{@=gk++SGuJG=q&4+|0jA_&6(0000aPa$F$$d70KjwD7=d?z>puTHdy{TU7c@ZO^UTJUT%GrPO{ zU2GnmME6bwpbi-LNIwnEdUayfvo$Ywhi+8IVXs2H&W`{;wIPE8z-DF(00vnAtYm*t zFbfslW*St$5_=(m4dbixoD!jZhH%Au469r?Bv651LsUx zs9Lh4eVYDkbNBdESG9{w2cf}aK;1Pw;`{J_;9>Ee!vI+dn`_AZdwx&T yuHfvn0?Fnt2|&TF1fI@~=2!KwXZ^nA|H?OYWK-e&$75>%0000L|u+%e;k}(dRH+ahOD8JV`cVg*uCgL5sYs@;A^b}F%V039M?&n9I1}JV z1H+0r5b#HAHZHYafwdDV#1S}GUk1-MsxY&Ef!ljoe2%pyViGRa&TMeu8_zQyY5s8)NUyRqBosW!s^Xu)n+H;Z$D=*d%2LQmBExG00000NkvXXu0mjf Dh5@c( diff --git a/src/main/resources/assets/hbm/textures/items/ln2_9.png b/src/main/resources/assets/hbm/textures/items/ln2_9.png deleted file mode 100644 index 8cc282346a66fd756aea1635e1686bced0f8861f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399 zcmV;A0dW3_P)Qz56-qrur^s_& z>O$>X4aek2hI1Cq0rB49J)rKey5EUyU)x}>K-!s1`FQXG8e#oPtrdx0`}o}Vx4kbm zI^PST3620$j^w$<`>vc_Qq_c9XBOee+22PZScr?58<8{6C1&MnWFj?Z@eJgXUqf`j zjgyV$MDQ7GL>z}Rp(1j`E(o=sI9)@G!bOwL_;(EFLs7P%>d2AI&X+{sntN{TEs1bh tP|jVp9Hwf;4wpW;pF*X3In5XT8gFx!OKPCk<@Nvo002ovPDHLkV1oXuwHE*Y diff --git a/src/main/resources/assets/hbm/textures/items/magnet_circular.png b/src/main/resources/assets/hbm/textures/items/magnet_circular.png deleted file mode 100644 index 4d8f16620943fd79007d7beed92102b5068f5171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf%V`&(a`VP&)O*}{Uyw^gTA8!NEzUs|)&>P&;g-5*yNYx|h~yf&XU lA&mWO`x1w(SAy@w`&XW`ZalffaTU>WdCX-I&L!%B?78Ce3`^*I!8~%w>^Eqe>y~zODtVxojt-pGUs+iDC%2`F-x} zN#^Iy={R28;q7GkDXlH*8lq`E)sja{nWMg)|s|D-nMQl^$s@q sr1V)`TddAW{YuUDQ~4~#y!OY1FDNJK7&Bjb2lOk0r>mdKI;Vst095I6@c;k- diff --git a/src/main/resources/assets/hbm/textures/items/magnetron.png b/src/main/resources/assets/hbm/textures/items/magnetron.png deleted file mode 100644 index 5f160f01faca065e5344ed7936ab98c56af10da0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmV+&0pk9NP)%025b$YuYdnZLD8e;&cstSOd(g2 zqYePnK~cI$HV4}Qr)*5rldl11@f%f05fT>#{3QB8`a6lg jq;S?j=tQxU#MSr!YOziF3AE0q00000NkvXXu0mjf$-Zx2G+gFpZ3kp92^>i_@qwawnz^Ebb&kI9-@;JIS;YU4Y5 zDknDr!NF+r8eJmqnB6D`gZ%y`IsICD+b$6XK3t+uYn oRnK5J>M-jdYd%j869)r>#t-EqJ39Z00Ug2M>FVdQ&MBb@0H-NQ1poj5 diff --git a/src/main/resources/assets/hbm/textures/items/nugget_reiium.png b/src/main/resources/assets/hbm/textures/items/nugget_reiium.png deleted file mode 100644 index b6b8a5d3f6e93fd75867adebbaedbc3b5bd6c538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfZoDj$~z zYqCB|F7`OLsmaIp#`Hj8CypsW3^N#YU3fEg@|@jskSQdAo$qLNUclU!c?a?*eQrE= anDMjGVW$<+Mb6Mw<&;$VRi#>+` diff --git a/src/main/resources/assets/hbm/textures/items/nugget_u238m2.png b/src/main/resources/assets/hbm/textures/items/nugget_u238m2.png deleted file mode 100644 index 95a04822b70e8c3ba0912c5b521897fc7f9ae5f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfPpz diff --git a/src/main/resources/assets/hbm/textures/items/nugget_verticium.png b/src/main/resources/assets/hbm/textures/items/nugget_verticium.png deleted file mode 100644 index c8f9333ecf122b81b6cb8cf7589c3bc3e5a66691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VffA9KI~^E*L54l8stHa_HIWRkbziSPG&y!TAggtb-yR8=KqSpqOk6XQ6l)e2f` zX_|)P@fdf0wK|TY+U<5^Sr&&Qz!)QK+s4$(vSe8n9*+kpf!A-14pONLJu9FBz zrGC5JR#sC2->U06d6H9a&N&%|VYBDQdMEII^##Lqw1P2Kr2PN@002ovPDHLkV1g|a BkPH9- diff --git a/src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png b/src/main/resources/assets/hbm/textures/items/pellets_chlorophyte.png deleted file mode 100644 index 6a5489d550e3d40259eafa8e0c9b9641f2febcce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfo9{|a$yJqf`MSe^C($Xq=j<}?>3W89ZdJ5y@SWU$ z?XUk_xexMp)dFqxcnl>H6pt;tK7F6zqwVuJW^1tRIMkk?bHL|L zr6L`M_a5z?V{5Rv>qJ|}gT3r&*HoLsQhcZJ=*;Y35WLQ#W4V+i*2kISSK6A{Q5R1v zd7t1h^X)T}8G8@pn7`vq-8TDfP?Wk0i{*3gMIAi$Q#W(^PnrLkLH2yG*{MmtUjm)R N;OXk;vd$@?2>>YQQV;+D diff --git a/src/main/resources/assets/hbm/textures/items/pellets_flechette.png b/src/main/resources/assets/hbm/textures/items/pellets_flechette.png deleted file mode 100644 index b0711e2acdc103bd7203ab69ac5eadf063c8777f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf%@;Yz4eLTHR z+MJKbW-K_@wSv90*7w$jfZN*?mwk0^k*nD7zIsZ~a+>8l`IoHhlk-p5?Q@+2^aF#ZtDnm{r-UW| DXToJ~ diff --git a/src/main/resources/assets/hbm/textures/items/pill_salt.png b/src/main/resources/assets/hbm/textures/items/pill_salt.png deleted file mode 100644 index decab9dbabcbd05bd6caa31ff1f7d6baf33a9982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfQna3Xpsxs8o_$e^#7lq(;I=nG3=gzv#qch^S%Amtk*d%|M~Pa zevRJIm#xO>=l(o@`s=`lpR*a5^{=zDmFkMG$%-tHoKXMY;IO}<92=V=A6wgV`vT3w z?^s`7{rkV3>!Sioi-m;Gw{!pceRac_Js2Z+XDnaat+*{DNN_b{#Nh{@%^BxNbugu$ zoAY!1k|kf_Jw0FkKbu|sPg_&-uYK_|o@)jNq)e}^{{7!SWJ~Mk%AIxwF82G+7aX$` zb+$d1app&b+#!KS2?;+sZ*LVj&U9`HM}Ilc5kSyp+_ur;Y7h%U(k>sZRN=QQzyM(I MboFyt=akR{0Qc*Id;kCd diff --git a/src/main/resources/assets/hbm/textures/items/pill_zinc.png b/src/main/resources/assets/hbm/textures/items/pill_zinc.png deleted file mode 100644 index d93286d7369107218e4737d7e5388319bdca0aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmV-D0mA-?P)sDuKY2E+z=UU15kIkRp&$MSk@D!-YQJs(=js z0woG00v!TF%%!pj@gCS{yV;u=W^Wf3)=li8e}4;qaentGa>eF<@!@a;peUct__vb5 z_g6m)PvVcyqnI>0f^#lp>A*Ox$kKt$!>h;@69BYrOV=kTrRe%3Mw1P!wV^D_85?70 znkGoxXo5>iGRT6Js9aH&1 z?$>cfUe_l-x0g>obdEP?t?kr~1f}y)(tU;NSiH0@-YU3W`r@~oWxCF3XGUJZZ+}+? zMP1#NtFct3b|V9W(~KX|c|u1lK0p6DC9LoZv)plOYx6Dt5Bxv8{4hu2qdA*160Ryv zOwZO`QV{Ag&v`~fcCoH;!23U{j34g(oc3G4SS3A}vIur=0!p5nL&SIF1nnTdN4C z0yy}7zXt#$Nn#c8=~4gylx5lezTIxt^G+SO-+xwBRUyxF000qLU0Askz;FRdDN)xo zhzRHN8IOnR#PcG+6jBrghzL#7;Cj7wL^$sP6TXt&Zimfg(|g9N0F$O^-Y-CiNJ}Y4 z&v-4uq9_3TwPWA?1D+W0Y|VOsZBNr&XW3!4?Ix3z`^tRM1D3Yh7}g@>g5wuV*R3}CAk+4- zmAZsp2l&f|*Q#x$I)y7;h)5rgUyFv!6rM7gv(K0EbOlPOcCHf<;yCsdx22O=5Nvgl jBmmyLT>gvjdG98_^4%dg9A>>700000NkvXXu0mjfad^*1 diff --git a/src/main/resources/assets/hbm/textures/items/pirfenidone.png b/src/main/resources/assets/hbm/textures/items/pirfenidone.png deleted file mode 100644 index 9ab831d0fa157620e453dae0fdf33b446617c26d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)y3>J$b zHZ2NbQPUNX!(`E*VvvJHVP%GGw;L>;$#c8=jveSrf8O`rk diff --git a/src/main/resources/assets/hbm/textures/items/powder_daffergon.png b/src/main/resources/assets/hbm/textures/items/powder_daffergon.png deleted file mode 100644 index f9afea21267cede7f7bf8f774884ee4c79ee2bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307 zcmV-30nGl1P)`{<0mbvvRC6oK&-e4L;s2wc@&%RuHTl+ff2s$cQ_hNr&&cQI%s7tpeg8Ap zoH9B$t2duh`mH$3rdXt0*ZVb><^q6r8Yv|V-&kQ9xoumNQb;Lr&aq@kstXFLSk|c? zo>th3gHIK@2;|*rN7r>6>my33n8Z1UF$Owj3(dkIsA{1x#zb<64{(3KW3g=5V6i;7 zW*IM-#?wMaB7nulcMq;vOpsIhaFG(5lKuqA-}rL)f)BOvjp*HFB2@qY002ovPDHLk FV1io;f(rlu diff --git a/src/main/resources/assets/hbm/textures/items/powder_reiium.png b/src/main/resources/assets/hbm/textures/items/powder_reiium.png deleted file mode 100644 index 52bd800c86f3dc9be333bb584ad5ab0132828e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@Uf?hV~BRKj6_QU96e`q z&R}s{=os1D*Y(>Xr$E1Npzg-kR>iruU&uQd z_+Fkd^H=%PkewRhr@UUAJGbGdsKLP-PLEkCmd(AjU~d1pqwD6d%-wq|EbH^jj(_3L zGNM&kM2c%3EVR*{elpG_WGa`yPuW1827!i-1_?823POz_<6i c!BHE=?wtwWmoqwC1A3Ri)78&qol`;+0E?l7XaE2J diff --git a/src/main/resources/assets/hbm/textures/items/powder_unobtainium.png b/src/main/resources/assets/hbm/textures/items/powder_unobtainium.png deleted file mode 100644 index 2f26e8148d0adcae710df6090f7e109f8c2690b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@Rz5HV~BK54l7Lj({M}bRTop| zQ&x{(oELWdV>tYQRfVs0Nv*4{mdeZ6_Qz2(G!LIkx#XQc`K(`d2gm+|gyQ@^`x_0p zCv7+`@W?Toq1fph|INAl!FsLbR-!Mi{NWK{E!cfCt7CzquI0y*(`^mnK3T8Ze=z%k z&sn|$YK)6GI+9hBjW%wtY0=)}b?@yfH77l9y&fmgb3CSJW-YxrbGjVoW8Lewc|%#X zY-5?12kXW!vr;vx-1^8gZEc&`{32!FZ=y}g=AR@(S#9(V7+m!!F+I5d!CQ^9EKVXE zH=RyQ+S)iF=Ar2Owyk#qm4CGue|miSy<-Ivt2*<8uHt1Cz))cDboFyt=akR{0L)m5 Ai~s-t diff --git a/src/main/resources/assets/hbm/textures/items/powder_verticium.png b/src/main/resources/assets/hbm/textures/items/powder_verticium.png deleted file mode 100644 index 5346e7b44cf51411d81056fe683d58b6af388e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@TI4VV~BJ%js2HjH>~<9nIZL{@^icD648}jTUXQ+ROg)5+co=0QH=3T@vQsm zo5gNT^S4g0xpvg!X8_;Ut(is_0yI;{ttG6Dj ztX%LhxbIq+o}!BT?<3xof#+hTte){E{>7ISM|Ea+7~E_=*|Uvd@*zj*mj}Gc9|_o} kN~C-{ASZUOd}fn5-xPx#a(aFNKu$~Gyg!zvzM29Bq|wi_A4BA zU|1r^;xH?LVTq(mGcQAC6Q=_67ly;j*yK8vBtmdKI;Vst0GKa~WdHyG diff --git a/src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png b/src/main/resources/assets/hbm/textures/items/ring_starmetal_alt.png deleted file mode 100644 index ebdca2cc5a4b17b7fd2de5b55acedb35875b5303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmV-{0e=38P)PJG2rKJRXNYqMKCi!(baMPqEjaXZxx!2N-4`Y z91dTCtTCSFp_D>vO;HqRtpRXd7p*n-`<=~ZV}WZxo*xas`Fv)zT9KxyWo)%t1VO;{ zdL@qMrb$je_14_aqw1JpI5va901+Vw0!E{eWmHPBUay(W zW{3!vOJOfD%cf4h|6z8!9k<&J5y5p`fTy!o%@zP)yWO%_Eb6AFs#TOrCyyV|SagFvd~l!MzSU3rdwb}WwpM!H>7H6AoJHo@U=z~`%j$Kye{JyM`D_kGEQ-|r zK9>%;Tn>rdT^Ml#idhl&zjt;;4R31V-I+aSWIppT+4vhMOT~=d|zj@11k%Jl6dAAV4m(QP=_A;ziD{l7oL1$#Heq9xl zxs8sFf-EjBVq|0lhGDP(pUh;eFKO|g8QNyfA;n;J|4t!ILzS_x7!V_ zAQFj$m{1~%zeXk}ZS(8&Mc^r&nw+G=L-)iT7qXNW2m}NV;3WDPG(iYszQj0h#9!Pg jFAu4xs1R$424}VZp3@^l2(pY@00000NkvXXu0mjfwPR1= diff --git a/src/main/resources/assets/hbm/textures/items/singularity_3.png b/src/main/resources/assets/hbm/textures/items/singularity_3.png deleted file mode 100644 index a171074f161d5b16318997a435ff341d0a15d120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmV;%0y+JOP)~s;4TDe?CBocu!27bR^UE9rZ99Wj6{_*kgtvJsnP%f9l($W$P-`cA+ zq~Jr1W0z4!mCbcsk^ryQYX$}ewg_1AQ>)dG&1PXU=qWVe8TR8W!stT)A%5b45nwpH z^IIwu3aC^n|4W#jo@N&)2_JpJVWPz%y+)GGpoxO8h_jHFA>!~-3#Z{yD3M5@SS$kd zdL8L>nh6`~#V*RAjsCQrpzCO*4i4a~3Lv@m@p;IE`Q9fW$mjFG{QSHUiNPVJOhX9M zY0lgQKLt3u+1AJlT|M;u_8q#9IC+dk-QC@=CMPF_K3DD2dcR=}@3Df7WEZN(crkuBrP|i~O2%6~$5_Ao_m6?Egs?{pL zBK+W?9fBVRnaMhzSJ~E>K{IS5`ToJ+MbzDOJbgEdkNB&|w&+5dA(Ln!n?|umX_w*Z zzRWuh5EJQRIR5IPmh$ub4aC2^)S5&Oo=_;HGhJb^yg>yMh+&E$`VmAYXFd?yi}rd1WBUClPwwm-Ek2*3bNz#= z0eKsZMpgbOl}ZQ(g9@P55Y1I?)LhR9eYkX!?soK%!+~ftPArqjXz7q9>O7gAZQJUU s|5l^>Vzx1~`5}n~0s&Q_0_=4C1Ji&Sa=E*xqW}N^07*qoM6N<$f}tNw*8l(j diff --git a/src/main/resources/assets/hbm/textures/items/singularity_micro.png b/src/main/resources/assets/hbm/textures/items/singularity_micro.png deleted file mode 100644 index b1c9e4765801d45113ac3da6b82715a6e78229be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf88|oII#-=Ir4OIX8{gWX;^b>E`PCcYo<$v%_n-w@aLp zu{`zR$NBoUDP6Dr-?*|VLAd7kSMI|*tDj5U+gE$~01y;Bf0M~}jz53nE|JyT|LXrA zJfNn)@%;a<5Azx)PG(-s7!j+Go^t9#tiz0l*W17I>^ZZCXVs@wJcsVsMDQMv>fAh12a*DRC>|XXT#F|Tkg+Wx++%Mk0Vgu0i44$rjF6*2UngE2OY`_2j diff --git a/src/main/resources/assets/hbm/textures/items/singularity_spark.png b/src/main/resources/assets/hbm/textures/items/singularity_spark.png deleted file mode 100644 index c2e97f9a6b41311d4b3165fa79abee2aee87f329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)gnKHAro(hq0>MJWOXp;Zb&u(&WL>W&3& zj2joaAz{aw1QzW03r1HY>VoJBS>Vd3QKF==0g4o~7KM_&7U{=(?YquhRI;6Q9-WaNZ^U=Et5VQy}YF9f>ky^h;~QFufjewTN# zUPz!`@*v`kqFFfuUDIiKc^QR5;lG5%#YH#-CtY?7(jD&@-Krm@Ryjn+G6WL2jI+*j z)ZZ{fUYn1&6bgkxNTpI>wOS25Jw2#w8#LB=4~}{#s2JrCaIAS-hS@d!R6>9bXpW~}oOuoccY2#Qk6Cg1e zI%(+b?Pa227+6_ZndUUn73@YslONIkeguO-T%F0H@2zB`IiY4WZ4`0WGIvUHxjwF@rzpjHv6n zS;%R|sTGYQq&G7d>KjI#%LSWkZiXjN_){$yy8&m(oT zf$_%=Ffe`zPoF)(x3v^zzr-LYpTHft;ulKD7 z&CShPQY|joU&^t-0z*GmI5+u|y-)qjNV97~dc7WfeSQB6#9}cxolZ!CnTLz-FgPpo z$;V}ucSKm%9pu#46^{8L%*{NfbO@}kuSYl>{wLt|dKGbz4(mNWdl};Nbd;N~e`Z?C z6wMtI%&2PS&|rv@fnT&+PEZ+z4u=EddjDm6cHE+LaPuMt&P@1;zCFhABtloSzD^ zslm;YXU_7Ge}o46PC6~EbR~Nl79^Z?LIro}Td~dM0A*8j(3Oo8b3}RXS4Zl(* Date: Tue, 25 Mar 2025 21:13:23 +0100 Subject: [PATCH 24/32] Fixed crate item movement prevention applying to all held items (let me move this coal powder) --- .../hbm/inventory/container/ContainerCrateBase.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java index b19725c1f..84df7fad8 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.items.block.ItemBlockStorageCrate; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; @@ -18,8 +19,15 @@ public class ContainerCrateBase extends ContainerBase { @Override public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) { // prevents the player from moving around the currently open box - if(mode == 2 && button == player.inventory.currentItem) return null; - if(index == player.inventory.currentItem + 27 + this.tile.getSizeInventory()) return null; + if(player.inventory.getStackInSlot(player.inventory.currentItem) != null && + player.inventory.getStackInSlot(player.inventory.currentItem).getItem() instanceof ItemBlockStorageCrate) { + if (mode == 2 && button == player.inventory.currentItem) { + return null; + } + if (index == player.inventory.currentItem + 27 + this.tile.getSizeInventory()) { + return null; + } + } return super.slotClick(index, button, mode, player); } From 86ce0f650993952a3a3b437f16e69d8a14c5b782 Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 26 Mar 2025 11:50:35 +1100 Subject: [PATCH 25/32] if rod is hot, only show cooling recipe, if rod is cold, show only disassembly recipe --- .../com/hbm/handler/nei/FuelPoolHandler.java | 21 ++++++++ .../nei/RBMKRodDisassemblyHandler.java | 49 +++++++++++-------- .../com/hbm/items/machine/ItemRBMKRod.java | 4 +- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java b/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java index cdbce5b5c..92b08e2c7 100644 --- a/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java +++ b/src/main/java/com/hbm/handler/nei/FuelPoolHandler.java @@ -2,6 +2,9 @@ package com.hbm.handler.nei; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.recipes.FuelPoolRecipes; +import com.hbm.items.machine.ItemRBMKRod; + +import net.minecraft.item.ItemStack; public class FuelPoolHandler extends NEIUniversalHandler { @@ -13,4 +16,22 @@ public class FuelPoolHandler extends NEIUniversalHandler { public String getKey() { return "ntmSpentDrum"; } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) < 50 && ItemRBMKRod.getHullHeat(ingredient) < 50) return; + } + + super.loadUsageRecipes(ingredient); + } + + @Override + public void loadCraftingRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) >= 50 || ItemRBMKRod.getHullHeat(ingredient) >= 50) return; + } + + super.loadCraftingRecipes(ingredient); + } } diff --git a/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java index fe92ebec5..1e7decef2 100644 --- a/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java +++ b/src/main/java/com/hbm/handler/nei/RBMKRodDisassemblyHandler.java @@ -38,35 +38,44 @@ public class RBMKRodDisassemblyHandler extends NEIUniversalHandler { return map; } - public static class ComparableStackHeat extends ComparableStack { - - // I was going to filter by these, but found it is just best to show all possible recipes for everything but heat - // that and... I'm actually stumped on how to filter by NBT, seeing as both `isApplicable` and `matchesRecipe` don't seem to work - private final boolean matchHot; - private final int matchEnrichment; - private final boolean matchPoison; - - public ComparableStackHeat(Item item, boolean matchHot) { - this(item, matchHot, -1, false); + // Don't show recipes for hot rods (which will cause it to only show cooling recipes) + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient != null && ingredient.getItem() != null && ingredient.getItem() instanceof ItemRBMKRod) { + if(ItemRBMKRod.getCoreHeat(ingredient) > 50 || ItemRBMKRod.getHullHeat(ingredient) > 50) return; } - public ComparableStackHeat(Item item, boolean matchHot, int matchEnrichment, boolean matchPoison) { + super.loadUsageRecipes(ingredient); + } + + public static class ComparableStackHeat extends ComparableStack { + + // I was going to filter by all of these, but found it is just best to show all possible recipes for everything but heat + private final boolean isHot; + private final int enrichment; + private final boolean hasPoison; + + public ComparableStackHeat(Item item, boolean isHot) { + this(item, isHot, -1, false); + } + + public ComparableStackHeat(Item item, boolean isHot, int enrichment, boolean hasPoison) { super(item); - this.matchHot = matchHot; - this.matchEnrichment = matchEnrichment; - this.matchPoison = matchPoison; + this.isHot = isHot; + this.enrichment = enrichment; + this.hasPoison = hasPoison; } public ItemStack toStack() { ItemStack stack = super.toStack(); ItemRBMKRod rod = (ItemRBMKRod) stack.getItem(); - if(matchEnrichment >= 0) { - ItemRBMKRod.setYield(stack, Math.max(1 - ((double) matchEnrichment) / 5, 0.05) * rod.yield); + if(enrichment >= 0) { + ItemRBMKRod.setYield(stack, Math.min(1 - ((double) enrichment) / 5, 0.99) * rod.yield); } else { ItemRBMKRod.setYield(stack, 0.2 * rod.yield); } - if(matchPoison) ItemRBMKRod.setPoison(stack, 50); - if(!matchHot) return stack; + if(hasPoison) ItemRBMKRod.setPoison(stack, 50); + if(!isHot) return stack; ItemRBMKRod.setCoreHeat(stack, 100); ItemRBMKRod.setHullHeat(stack, 50); return stack; @@ -76,8 +85,8 @@ public class RBMKRodDisassemblyHandler extends NEIUniversalHandler { public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + matchEnrichment; - result = prime * result + (matchPoison ? 1 : 0); + result = prime * result + enrichment; + result = prime * result + (hasPoison ? 1 : 0); return result; } diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 2b0fd0e98..e9c502348 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -425,7 +425,7 @@ public class ItemRBMKRod extends Item { if(this == ModItems.rbmk_fuel_drx) { - if(ItemRBMKRod.getHullHeat(stack) >= 50 && ItemRBMKRod.getCoreHeat(stack) >= 50) { + if(ItemRBMKRod.getHullHeat(stack) >= 50 || ItemRBMKRod.getCoreHeat(stack) >= 50) { list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); } @@ -449,7 +449,7 @@ public class ItemRBMKRod extends Item { } else { - if(ItemRBMKRod.getHullHeat(stack) >= 50 && ItemRBMKRod.getCoreHeat(stack) >= 50) { + if(ItemRBMKRod.getHullHeat(stack) >= 50 || ItemRBMKRod.getCoreHeat(stack) >= 50) { list.add(EnumChatFormatting.GOLD + I18nUtil.resolveKey("desc.item.wasteCooling")); } From 9943a73f2a9a24a746a42875b3aed6a5cf2ec7c5 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 26 Mar 2025 16:53:07 +0100 Subject: [PATCH 26/32] groundbreaking changes --- changelog | 7 ++++++- src/main/java/com/hbm/blocks/bomb/BlockTaint.java | 3 ++- .../com/hbm/items/weapon/sedna/factory/XFactory10ga.java | 2 +- .../com/hbm/items/weapon/sedna/factory/XFactory50.java | 2 +- .../com/hbm/items/weapon/sedna/factory/XFactory762mm.java | 2 +- .../com/hbm/items/weapon/sedna/mods/WeaponModManager.java | 3 +-- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/changelog b/changelog index 299a12998..7cde1fc3f 100644 --- a/changelog +++ b/changelog @@ -2,4 +2,9 @@ * .75 bolts now work as advertised * Updated lead pipe texture * Removed recipes from a few ancient melee weapons, as well as the creative tab listing -* Removed flat magnets \ No newline at end of file +* Removed flat magnets +* Taint should now also affect non-solid blocks that are full cubes +* Reduced the AoE size of 7.62mm, .50 BMG and 10 gauge explosive projectiles + +## Fixed +* Fixed taint destroying bedrock \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java index 079058a64..c82d2526d 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java @@ -19,6 +19,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; @@ -46,7 +47,7 @@ public class BlockTaint extends Block implements ITooltipProvider { if(Math.abs(i) + Math.abs(j) + Math.abs(k) > 4) continue; if(rand.nextFloat() > 0.25F) continue; Block b = world.getBlock(x + i, y + j, z + k); - if(!b.isNormalCube() || b.isAir(world, x + i, y + j, z + k)) continue; + if(!b.renderAsNormalBlock() || b.isAir(world, x + i, y + j, z + k) || b == Blocks.bedrock) continue; int targetMeta = meta + 1; boolean hasAir = false; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java index e875b7800..c452655d3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory10ga.java @@ -35,7 +35,7 @@ public class XFactory10ga { public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 1.5F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java index 1dded0aab..e67396128 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java @@ -36,7 +36,7 @@ public class XFactory50 { public static BiConsumer LAMBDA_STANDARD_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 3.5F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java index eb7b7b79e..b87fba86d 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java @@ -43,7 +43,7 @@ public class XFactory762mm { public static BiConsumer LAMBDA_TINY_EXPLODE = (bullet, mop) -> { if(mop.typeOfHit == mop.typeOfHit.ENTITY && bullet.ticksExisted < 3 && mop.entityHit == bullet.getThrower()) return; - Lego.tinyExplode(bullet, mop, 2F); bullet.setDead(); + Lego.tinyExplode(bullet, mop, 1.5F); bullet.setDead(); }; public static void init() { diff --git a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java index 359936bd2..f586acccc 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mods/WeaponModManager.java @@ -71,8 +71,7 @@ public class WeaponModManager { Item[] steelGuns = new Item[] { ModItems.gun_light_revolver, ModItems.gun_light_revolver_atlas, - ModItems.gun_henry, - ModItems.gun_henry_lincoln, + ModItems.gun_henry, ModItems.gun_henry_lincoln, ModItems.gun_greasegun, ModItems.gun_maresleg, ModItems.gun_maresleg_akimbo, ModItems.gun_flaregun }; From 300f005de4caac256d9b9e7df959ecaaad9f5963 Mon Sep 17 00:00:00 2001 From: LegendaryDoge30 Date: Wed, 26 Mar 2025 18:18:39 +0100 Subject: [PATCH 27/32] flux added a single parenthesis to the thorium rbmk fuel flux function --- .../com/hbm/items/machine/ItemRBMKRod.java | 164 +++++++++--------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java index 895c788c6..c1e39e213 100644 --- a/src/main/java/com/hbm/items/machine/ItemRBMKRod.java +++ b/src/main/java/com/hbm/items/machine/ItemRBMKRod.java @@ -20,7 +20,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class ItemRBMKRod extends Item { - + public ItemRBMKPellet pellet; public String fullName = ""; //full name of the fuel rod public double reactivity; //endpoint of the function @@ -35,7 +35,7 @@ public class ItemRBMKRod extends Item { public double diffusion = 0.02D; //the speed at which the core heats the hull public NType nType = NType.SLOW; //neutronType, the most efficient neutron type for fission public NType rType = NType.FAST; //releaseType, the type of neutrons released by this fuel - + /* _____ * ,I I I I, * |'-----'| @@ -52,7 +52,7 @@ public class ItemRBMKRod extends Item { * | | * '-----' * I I I I - * + * * i drew a fuel rod yay */ @@ -63,7 +63,7 @@ public class ItemRBMKRod extends Item { public ItemRBMKRod(String fullName) { this.fullName = fullName; - + this.setContainerItem(ModItems.rbmk_fuel_empty); this.setMaxStackSize(1); this.setCreativeTab(MainRegistry.controlTab); @@ -93,7 +93,7 @@ public class ItemRBMKRod extends Item { this.depFunc = func; return this; } - + public ItemRBMKRod setXenon(double gen, double burn) { this.xGen = gen; this.xBurn = burn; @@ -120,7 +120,7 @@ public class ItemRBMKRod extends Item { this.rType = rType; return this; } - + /** * Adjusts the input flux using the poison level * Generates, then burns poison @@ -131,82 +131,82 @@ public class ItemRBMKRod extends Item { * @return outFlux */ public double burn(World world, ItemStack stack, double inFlux) { - + inFlux += selfRate; - + //if xenon poison is enabled if(RBMKDials.getXenon(world)) { double xenon = getPoison(stack); xenon -= xenonBurnFunc(inFlux); - + inFlux *= (1D - getPoisonLevel(stack)); - + xenon += xenonGenFunc(inFlux); - + if(xenon < 0D) xenon = 0D; if(xenon > 100D) xenon = 100D; - + setPoison(stack, xenon); } - + double outFlux = reactivityFunc(inFlux, getEnrichment(stack)) * RBMKDials.getReactivityMod(world); //if depletion is enabled if(RBMKDials.getDepletion(world)) { double y = getYield(stack); y -= inFlux; - + if(y < 0D) y = 0D; - + setYield(stack, y); } - + double coreHeat = this.getCoreHeat(stack); coreHeat += outFlux * heat; - + this.setCoreHeat(stack, rectify(coreHeat)); - + return outFlux; } - + private double rectify(double num) { - + if(num > 1_000_000D) num = 1_000_000D; if(num < 20D || Double.isNaN(num)) num = 20D; - + return num; } - + /** * Heat up the core based on the outFlux, then move some heat to the hull * @param stack */ public void updateHeat(World world, ItemStack stack, double mod) { - + double coreHeat = this.getCoreHeat(stack); double hullHeat = this.getHullHeat(stack); - + if(coreHeat > hullHeat) { - + double mid = (coreHeat - hullHeat) / 2D; - + coreHeat -= mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; hullHeat += mid * this.diffusion * RBMKDials.getFuelDiffusionMod(world) * mod; - + this.setCoreHeat(stack, rectify(coreHeat)); this.setHullHeat(stack, rectify(hullHeat)); } } - + /** * return one tick's worth of heat and cool the hull of the fuel rod, this heat goes into the fuel rod assembly block * @param stack * @return */ public double provideHeat(World world, ItemStack stack, double heat, double mod) { - + double hullHeat = this.getHullHeat(stack); - + //metldown! the hull melts so the entire structure stops making sense //hull and core heats are instantly equalized into 33% of their sum each, //the rest is sent to the component which is always fatal @@ -217,20 +217,20 @@ public class ItemRBMKRod extends Item { this.setHullHeat(stack, avg); return avg - heat; } - + if(hullHeat <= heat) return 0; - + double ret = (hullHeat - heat) / 2; - + ret *= RBMKDials.getFuelHeatProvision(world) * mod; - + hullHeat -= ret; this.setHullHeat(stack, hullHeat); - + return ret; } - + public static enum EnumBurnFunc { PASSIVE(EnumChatFormatting.DARK_GREEN + "SAFE / PASSIVE"), //const, no reactivity LOG_TEN(EnumChatFormatting.YELLOW + "MEDIUM / LOGARITHMIC"), //log10(x + 1) * reactivity * 50 @@ -241,22 +241,22 @@ public class ItemRBMKRod extends Item { LINEAR(EnumChatFormatting.RED + "DANGEROUS / LINEAR"), //x * reactivity QUADRATIC(EnumChatFormatting.RED + "DANGEROUS / QUADRATIC"), //x^2 / 100 * reactivity EXPERIMENTAL(EnumChatFormatting.RED + "EXPERIMENTAL / SINE SLOPE"); //x * (sin(x) + 1) - + public String title = ""; - + private EnumBurnFunc(String title) { this.title = title; } } - + /** * @param enrichment [0;100] ...or at least those are sane levels * @return the amount of reactivity yielded, unmodified by xenon */ public double reactivityFunc(double in, double enrichment) { - + double flux = in * reactivityModByEnrichment(enrichment); - + switch(this.function) { case PASSIVE: return selfRate * enrichment; case LOG_TEN: return Math.log10(flux + 1) * 0.5D * reactivity; @@ -268,20 +268,20 @@ public class ItemRBMKRod extends Item { case QUADRATIC: return flux * flux / 10000D * reactivity; case EXPERIMENTAL: return flux * (Math.sin(flux) + 1) * reactivity; } - + return 0; } - + public String getFuncDescription(ItemStack stack) { - + String function; - + switch(this.function) { case PASSIVE: function = EnumChatFormatting.RED + "" + selfRate; break; case LOG_TEN: function = "log10(%1$s + 1) * 0.5 * %2$s"; break; - case PLATEU: function = "(1 - e^-%1$s / 25)) * %2$s"; + case PLATEU: function = "(1 - e^(-%1$s / 25)) * %2$s"; break; case ARCH: function = "(%1$s - %1$s² / 10000) / 100 * %2$s [0;∞]"; break; @@ -297,20 +297,20 @@ public class ItemRBMKRod extends Item { break; default: function = "ERROR"; } - + double enrichment = getEnrichment(stack); - + if(enrichment < 1) { enrichment = reactivityModByEnrichment(enrichment); String reactivity = EnumChatFormatting.YELLOW + "" + ((int)(this.reactivity * enrichment * 1000D) / 1000D) + EnumChatFormatting.WHITE; String enrichmentPer = EnumChatFormatting.GOLD + " (" + ((int)(enrichment * 1000D) / 10D) + "%)"; - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity).concat(enrichmentPer); } - + return String.format(Locale.US, function, selfRate > 0 ? "(x" + EnumChatFormatting.RED + " + " + selfRate + "" + EnumChatFormatting.WHITE + ")" : "x", reactivity); } - + public static enum EnumDepleteFunc { LINEAR, //old function RAISING_SLOPE, //for breeding fuels such as MEU, maximum of 110% at 28% depletion @@ -318,9 +318,9 @@ public class ItemRBMKRod extends Item { GENTLE_SLOPE, //recommended for most fuels, maximum barely over the start, near the beginning STATIC; //for arcade-style neutron sources } - + public double reactivityModByEnrichment(double enrichment) { - + switch(this.depFunc) { default: case LINEAR: return enrichment; @@ -330,7 +330,7 @@ public class ItemRBMKRod extends Item { case GENTLE_SLOPE: return enrichment + (Math.sin(enrichment * Math.PI) / 3D); //x + (sin(x * pi) / 3) also works } } - + /** * Xenon generated per tick, linear function * @param flux @@ -339,7 +339,7 @@ public class ItemRBMKRod extends Item { public double xenonGenFunc(double flux) { return flux * xGen; } - + /** * Xenon burned away per tick, quadratic function * @param flux @@ -348,7 +348,7 @@ public class ItemRBMKRod extends Item { public double xenonBurnFunc(double flux) { return (flux * flux) / xBurn; } - + /** * @param stack * @return enrichment [0;1] @@ -356,7 +356,7 @@ public class ItemRBMKRod extends Item { public static double getEnrichment(ItemStack stack) { return getYield(stack) / ((ItemRBMKRod) stack.getItem()).yield; } - + /** * @param stack * @return poison [0;1] @@ -415,15 +415,15 @@ public class ItemRBMKRod extends Item { @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - + list.add(EnumChatFormatting.ITALIC + this.fullName); - + if(this == ModItems.rbmk_fuel_drx) { - + if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmx.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmx.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmx.splitsWith", I18nUtil.resolveKey(nType.unlocalized + ".x"))); @@ -437,13 +437,13 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.skinTemp", ((int)(getHullHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmx.coreTemp", ((int)(getCoreHeat(stack) * 10D) / 10D) + "m")); list.add(EnumChatFormatting.DARK_RED + I18nUtil.resolveKey("trait.rbmx.melt", meltingPoint + "m")); - + } else { if(selfRate > 0 || this.function == EnumBurnFunc.SIGMOID) { list.add(EnumChatFormatting.RED + I18nUtil.resolveKey("trait.rbmk.source")); } - + list.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey("trait.rbmk.depletion", ((int)(((yield - getYield(stack)) / yield) * 100000D)) / 1000D + "%")); list.add(EnumChatFormatting.DARK_PURPLE + I18nUtil.resolveKey("trait.rbmk.xenon", ((int)(getPoison(stack) * 1000D) / 1000D) + "%")); list.add(EnumChatFormatting.BLUE + I18nUtil.resolveKey("trait.rbmk.splitsWith", I18nUtil.resolveKey(nType.unlocalized))); @@ -471,10 +471,10 @@ public class ItemRBMKRod extends Item { list.add(EnumChatFormatting.RED + "Skin temp: " + ((int)(getHullHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.RED + "Core temp: " + ((int)(getCoreHeat(stack) * 10D) / 10D) + "°C"); list.add(EnumChatFormatting.DARK_RED + "Melting point: " + meltingPoint + "°C");*/ - + super.addInformation(stack, player, list, bool); } - + /* __ __ ____ ________ * | \ | | | __ \ |__ __| * | \ | | | |__| | | | @@ -482,40 +482,40 @@ public class ItemRBMKRod extends Item { * | | \ | | |__| | | | * |__| \__| |_____/ |__| */ - + public static void setYield(ItemStack stack, double yield) { setDouble(stack, "yield", yield); } - + public static double getYield(ItemStack stack) { - + if(stack.getItem() instanceof ItemRBMKRod) { return getDouble(stack, "yield"); } - + return 0; } - + public static void setPoison(ItemStack stack, double xenon) { setDouble(stack, "xenon", xenon); } - + public static double getPoison(ItemStack stack) { return getDouble(stack, "xenon"); } - + public static void setCoreHeat(ItemStack stack, double heat) { setDouble(stack, "core", heat); } - + public static double getCoreHeat(ItemStack stack) { return getDouble(stack, "core"); } - + public static void setHullHeat(ItemStack stack, double heat) { setDouble(stack, "hull", heat); } - + public static double getHullHeat(ItemStack stack) { return getDouble(stack, "hull"); } @@ -529,23 +529,23 @@ public class ItemRBMKRod extends Item { public double getDurabilityForDisplay(ItemStack stack) { return 1D - getEnrichment(stack); } - + public static void setDouble(ItemStack stack, String key, double yield) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); - + stack.stackTagCompound.setDouble(key, yield); } - + public static double getDouble(ItemStack stack, String key) { - + if(!stack.hasTagCompound()) setNBTDefaults(stack); return stack.stackTagCompound.getDouble(key); } - + /** * Sets up the default values for all NBT data because doing it one-by-one will only correctly set the first called value and the rest stays 0 which is very not good * @param stack @@ -557,7 +557,7 @@ public class ItemRBMKRod extends Item { setCoreHeat(stack, 20.0D); setHullHeat(stack, 20.0D); } - + @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { setNBTDefaults(stack); //minimize the window where NBT screwups can happen From f9f1e1c73e088015ceb79872fb75403814338dc3 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 27 Mar 2025 16:02:35 +0100 Subject: [PATCH 28/32] go go gadget: replace uterus with 30lb bowling ball --- changelog | 5 +- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../blocks/generic/BlockSkeletonHolder.java | 114 ++++++ .../java/com/hbm/crafting/WeaponRecipes.java | 2 +- .../java/com/hbm/entity/EntityMappings.java | 6 - .../entity/mob/siege/EntitySiegeSkeleton.java | 181 ---------- .../hbm/entity/mob/siege/EntitySiegeUFO.java | 144 -------- .../entity/mob/siege/EntitySiegeZombie.java | 156 --------- .../java/com/hbm/inventory/material/Mats.java | 2 +- .../inventory/recipes/AssemblerRecipes.java | 29 +- .../inventory/recipes/PedestalRecipes.java | 13 + src/main/java/com/hbm/items/ItemEnums.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 24 -- src/main/java/com/hbm/main/ClientProxy.java | 7 +- .../java/com/hbm/main/CraftingManager.java | 8 - src/main/java/com/hbm/main/MainRegistry.java | 7 + .../java/com/hbm/main/ResourceManager.java | 6 + .../hbm/render/entity/mob/RenderGhost.java | 4 +- .../entity/mob/RenderSiegeSkeleton.java | 40 --- .../hbm/render/entity/mob/RenderSiegeUFO.java | 55 --- .../render/entity/mob/RenderSiegeZombie.java | 39 --- .../hbm/render/model/ModelSiegeZombie.java | 35 -- .../render/tileentity/RenderPedestalTile.java | 4 - .../tileentity/RenderSkeletonHolder.java | 72 ++++ .../java/com/hbm/tileentity/TileMappings.java | 2 + src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/models/blocks/skeleton_holder.obj | 330 ++++++++++++++++++ .../hbm/textures/blocks/dungeon_spawner.png | Bin 0 -> 714 bytes .../assets/hbm/textures/entity/siege_buff.png | Bin 1669 -> 0 bytes .../assets/hbm/textures/entity/siege_clay.png | Bin 2285 -> 0 bytes .../assets/hbm/textures/entity/siege_desh.png | Bin 492 -> 0 bytes .../assets/hbm/textures/entity/siege_dnt.png | Bin 540 -> 0 bytes .../hbm/textures/entity/siege_drill_buff.png | Bin 906 -> 0 bytes .../hbm/textures/entity/siege_drill_clay.png | Bin 925 -> 0 bytes .../hbm/textures/entity/siege_drill_desh.png | Bin 912 -> 0 bytes .../hbm/textures/entity/siege_drill_dnt.png | Bin 926 -> 0 bytes .../hbm/textures/entity/siege_drill_gold.png | Bin 910 -> 0 bytes .../hbm/textures/entity/siege_drill_iron.png | Bin 886 -> 0 bytes .../textures/entity/siege_drill_schrab.png | Bin 925 -> 0 bytes .../textures/entity/siege_drill_silver.png | Bin 890 -> 0 bytes .../hbm/textures/entity/siege_drill_stone.png | Bin 920 -> 0 bytes .../assets/hbm/textures/entity/siege_gold.png | Bin 512 -> 0 bytes .../assets/hbm/textures/entity/siege_iron.png | Bin 488 -> 0 bytes .../hbm/textures/entity/siege_schrab.png | Bin 477 -> 0 bytes .../hbm/textures/entity/siege_silver.png | Bin 481 -> 0 bytes .../hbm/textures/entity/siege_stone.png | Bin 1588 -> 0 bytes .../hbm/textures/entity/ufo_siege_buff.png | Bin 413 -> 0 bytes .../hbm/textures/entity/ufo_siege_clay.png | Bin 471 -> 0 bytes .../hbm/textures/entity/ufo_siege_desh.png | Bin 449 -> 0 bytes .../hbm/textures/entity/ufo_siege_dnt.png | Bin 482 -> 0 bytes .../hbm/textures/entity/ufo_siege_gold.png | Bin 468 -> 0 bytes .../hbm/textures/entity/ufo_siege_iron.png | Bin 443 -> 0 bytes .../hbm/textures/entity/ufo_siege_schrab.png | Bin 451 -> 0 bytes .../hbm/textures/entity/ufo_siege_silver.png | Bin 441 -> 0 bytes .../hbm/textures/entity/ufo_siege_stone.png | Bin 439 -> 0 bytes .../textures/items/item_secret.aberrator.png | Bin 0 -> 602 bytes 57 files changed, 573 insertions(+), 721 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java delete mode 100644 src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java delete mode 100644 src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java delete mode 100644 src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java delete mode 100644 src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java delete mode 100644 src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java delete mode 100644 src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java delete mode 100644 src/main/java/com/hbm/render/model/ModelSiegeZombie.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java create mode 100644 src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj create mode 100644 src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_buff.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_clay.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_desh.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_dnt.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_desh.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_dnt.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_gold.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_schrab.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_gold.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_iron.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_schrab.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_silver.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/siege_stone.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_buff.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_gold.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png delete mode 100644 src/main/resources/assets/hbm/textures/entity/ufo_siege_stone.png create mode 100644 src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png diff --git a/changelog b/changelog index 7cde1fc3f..46fa9943d 100644 --- a/changelog +++ b/changelog @@ -5,6 +5,9 @@ * Removed flat magnets * Taint should now also affect non-solid blocks that are full cubes * Reduced the AoE size of 7.62mm, .50 BMG and 10 gauge explosive projectiles +* Removed the old gun mechanism items, turrets now use the new cast parts +* A secret weapon and its variant have become craftable ## Fixed -* Fixed taint destroying bedrock \ No newline at end of file +* Fixed taint destroying bedrock +* Fixed ferrouranium plate not being castable \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8ea4d1a27..d86f1dd15 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -275,6 +275,7 @@ public class ModBlocks { public static Block part_emitter; public static Block deco_loot; public static Block pedestal; + public static Block skeleton_holder; public static Block bobblehead; public static Block snowglobe; public static Block plushie; @@ -1464,6 +1465,7 @@ public class ModBlocks { part_emitter = new PartEmitter().setBlockName("part_emitter").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(20.0F).setBlockTextureName(RefStrings.MODID + ":part_top"); deco_loot = new BlockLoot().setBlockName("deco_loot").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); pedestal = new BlockPedestal().setBlockName("pedestal").setCreativeTab(null).setHardness(2.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":pedestal_top"); + skeleton_holder = new BlockSkeletonHolder().setBlockName("skeleton_holder").setCreativeTab(null).setHardness(2.0F).setResistance(10.0F).setBlockTextureName("soul_sand"); bobblehead = new BlockBobble().setBlockName("bobblehead").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_steel"); snowglobe = new BlockSnowglobe().setBlockName("snowglobe").setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":glass_boron"); plushie = new BlockPlushie().setBlockName("plushie").setStepSound(Block.soundTypeCloth).setResistance(50_0000.0F).setCreativeTab(MainRegistry.blockTab).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":block_fiberglass_side"); @@ -2608,6 +2610,7 @@ public class ModBlocks { GameRegistry.registerBlock(part_emitter, ItemBlockBase.class, part_emitter.getUnlocalizedName()); GameRegistry.registerBlock(deco_loot, deco_loot.getUnlocalizedName()); GameRegistry.registerBlock(pedestal, pedestal.getUnlocalizedName()); + register(skeleton_holder); GameRegistry.registerBlock(bobblehead, ItemBlockMeta.class, bobblehead.getUnlocalizedName()); GameRegistry.registerBlock(snowglobe, ItemBlockMeta.class, snowglobe.getUnlocalizedName()); GameRegistry.registerBlock(plushie, ItemBlockBase.class, plushie.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java b/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java new file mode 100644 index 000000000..e64243534 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockSkeletonHolder.java @@ -0,0 +1,114 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class BlockSkeletonHolder extends BlockContainer { + + public BlockSkeletonHolder() { + super(Material.rock); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntitySkeletonHolder(); + } + + @Override public int getRenderType() { return -1; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { + int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) return true; + if(player.isSneaking()) return false; + + TileEntitySkeletonHolder pedestal = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z); + + if(pedestal.item == null && player.getHeldItem() != null) { + pedestal.item = player.getHeldItem().copy(); + player.inventory.mainInventory[player.inventory.currentItem] = null; + pedestal.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } else if(pedestal.item != null && player.getHeldItem() == null) { + player.inventory.mainInventory[player.inventory.currentItem] = pedestal.item.copy(); + pedestal.item = null; + pedestal.markDirty(); + world.markBlockForUpdate(x, y, z); + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + + if(!world.isRemote) { + TileEntitySkeletonHolder entity = (TileEntitySkeletonHolder) world.getTileEntity(x, y, z); + if(entity != null && entity.item != null) { + EntityItem item = new EntityItem(world, x + 0.5, y, z + 0.5, entity.item.copy()); + world.spawnEntityInWorld(item); + } + } + + super.breakBlock(world, x, y, z, block, meta); + } + + public static class TileEntitySkeletonHolder extends TileEntity { + + public ItemStack item; + + @Override public boolean canUpdate() { return false; } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.item = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("item")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + if(this.item != null) { + NBTTagCompound stack = new NBTTagCompound(); + this.item.writeToNBT(stack); + nbt.setTag("item", stack); + } + } + } +} diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index 49c31e360..959d5eabc 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -187,7 +187,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.mp_chip_5, 1), new Object[] { "P", "C", "S", 'P', ANY_RUBBER.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'S', ModBlocks.steel_scaffold }); //Turrets - CraftingManager.addRecipeAuto(new ItemStack(ModBlocks.turret_sentry, 1), new Object[] { "PPL", " MD", " SC", 'P', STEEL.plate(), 'M', ModItems.motor, 'L', ModItems.mechanism_rifle_1, 'S', ModBlocks.steel_scaffold, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'D', ModItems.crt_display }); + CraftingManager.addRecipeAuto(new ItemStack(ModBlocks.turret_sentry, 1), new Object[] { "PPL", " MD", " SC", 'P', STEEL.plate(), 'M', ModItems.motor, 'L', GUNMETAL.mechanism(), 'S', ModBlocks.steel_scaffold, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'D', ModItems.crt_display }); //Guns CraftingManager.addRecipeAuto(new ItemStack(ModItems.gun_b92), new Object[] { "DDD", "SSC", " R", 'D', ModItems.plate_dineutronium, 'S', STAR.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'R', ModItems.gun_lasrifle }); diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 9d0437c72..8a4cd26e1 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -17,7 +17,6 @@ import com.hbm.entity.missile.EntityMissileTier4.*; import com.hbm.entity.mob.*; import com.hbm.entity.mob.botprime.*; import com.hbm.entity.mob.glyphid.*; -import com.hbm.entity.mob.siege.*; import com.hbm.entity.particle.*; import com.hbm.entity.projectile.*; import com.hbm.entity.train.EntityRailCarBase.BoundingBoxDummyEntity; @@ -198,7 +197,6 @@ public class EntityMappings { addEntity(EntityNukeTorex.class, "entity_effect_torex", 250, false); addEntity(EntityArtilleryShell.class, "entity_artillery_shell", 1000); addEntity(EntityArtilleryRocket.class, "entity_himars", 1000); - addEntity(EntitySiegeTunneler.class, "entity_meme_tunneler", 1000); addEntity(EntityCog.class, "entity_stray_cog", 1000); addEntity(EntitySawblade.class, "entity_stray_saw", 1000); addEntity(EntityChemical.class, "entity_chemthrower_splash", 1000); @@ -237,10 +235,6 @@ public class EntityMappings { addMob(EntityFBI.class, "entity_ntm_fbi", 0x008000, 0x404040); addMob(EntityFBIDrone.class, "entity_ntm_fbi_drone", 0x008000, 0x404040); addMob(EntityRADBeast.class, "entity_ntm_radiation_blaze", 0x303030, 0x008000); - addMob(EntitySiegeZombie.class, "entity_meme_zombie", 0x303030, 0x008000); - addMob(EntitySiegeSkeleton.class, "entity_meme_skeleton", 0x303030, 0x000080); - addMob(EntitySiegeUFO.class, "entity_meme_ufo", 0x303030, 0x800000); - addMob(EntitySiegeCraft.class, "entity_meme_craft", 0x303030, 0x808000); addMob(EntityGlyphid.class, "entity_glyphid", 0x724A21, 0xD2BB72); addMob(EntityGlyphidBrawler.class, "entity_glyphid_brawler", 0x273038, 0xD2BB72); addMob(EntityGlyphidBehemoth.class, "entity_glyphid_behemoth", 0x267F00, 0xD2BB72); diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java deleted file mode 100644 index 46e685a52..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeSkeleton.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.hbm.entity.mob.siege; - -import com.hbm.entity.projectile.EntitySiegeLaser; -import com.hbm.items.ModItems; - -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntitySiegeSkeleton extends EntityMob implements IRangedAttackMob, IRadiationImmune { - - public EntitySiegeSkeleton(World world) { - super(world); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIArrowAttack(this, 1.0D, 20, 60, 15.0F)); - this.tasks.addTask(3, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(5, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - if(tier.noFall && source == DamageSource.fall) - return false; - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).applyModifier(new AttributeModifier("Tier Speed Mod", tier.speedMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).applyModifier(new AttributeModifier("Tier Damage Mod", tier.damageMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - protected void addRandomArmor() { - super.addRandomArmor(); - this.setCurrentItemOrArmor(0, new ItemStack(ModItems.detonator_laser)); - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - this.addRandomArmor(); - return super.onSpawnWithEgg(data); - } - - @Override - public void attackEntityWithRangedAttack(EntityLivingBase target, float f) { - - double x = posX; - double y = posY + this.getEyeHeight(); - double z = posZ; - - Vec3 vec = Vec3.createVectorHelper(target.posX - x, target.posY + target.getYOffset() + target.height * 0.5 - y, target.posZ - z).normalize(); - - SiegeTier tier = this.getTier(); - - for(int i = 0; i < 3; i++) { - EntitySiegeLaser laser = new EntitySiegeLaser(worldObj, this); - laser.setPosition(x, y, z); - laser.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 1F, i == 1 ? 0.15F : 5F); - laser.setColor(0x808000); - laser.setDamage(tier.damageMod); - laser.setExplosive(tier.laserExplosive); - laser.setBreakChance(tier.laserBreak); - if(tier.laserIncendiary) laser.setIncendiary(); - worldObj.spawnEntityInWorld(laser); - } - - this.playSound("hbm:weapon.ballsLaser", 2.0F, 0.9F + rand.nextFloat() * 0.2F); - } - - @Override - protected boolean isAIEnabled() { - return true; - } - - @Override - protected String getLivingSound() { - return "hbm:entity.siegeIdle"; - } - - @Override - protected String getHurtSound() { - return "hbm:entity.siegeHurt"; - } - - @Override - protected String getDeathSound() { - return "hbm:entity.siegeDeath"; - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java deleted file mode 100644 index 12551252a..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeUFO.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.hbm.entity.mob.siege; - -import com.hbm.entity.mob.EntityUFOBase; -import com.hbm.entity.projectile.EntitySiegeLaser; -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntitySiegeUFO extends EntityUFOBase implements IRadiationImmune { - - private int attackCooldown; - - public EntitySiegeUFO(World world) { - super(world); - this.setSize(1.5F, 1F); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(tier.speedMod); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health * 0.25); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void updateEntityActionState() { - super.updateEntityActionState(); - - if(this.courseChangeCooldown > 0) { - this.courseChangeCooldown--; - } - if(this.scanCooldown > 0) { - this.scanCooldown--; - } - - if(!worldObj.isRemote) { - if(this.attackCooldown > 0) { - this.attackCooldown--; - } - - if(this.attackCooldown == 0 && this.target != null) { - this.attackCooldown = 20 + rand.nextInt(5); - - double x = posX; - double y = posY; - double z = posZ; - - Vec3 vec = Vec3.createVectorHelper(target.posX - x, target.posY + target.height * 0.5 - y, target.posZ - z).normalize(); - SiegeTier tier = this.getTier(); - - EntitySiegeLaser laser = new EntitySiegeLaser(worldObj, this); - laser.setPosition(x, y, z); - laser.setThrowableHeading(vec.xCoord, vec.yCoord, vec.zCoord, 1F, 0.15F); - laser.setColor(0x802000); - laser.setDamage(tier.damageMod); - laser.setExplosive(tier.laserExplosive); - laser.setBreakChance(tier.laserBreak); - if(tier.laserIncendiary) laser.setIncendiary(); - worldObj.spawnEntityInWorld(laser); - this.playSound("hbm:weapon.ballsLaser", 2.0F, 1.0F); - } - } - - if(this.courseChangeCooldown > 0) { - approachPosition(this.target == null ? 0.25D : 0.5D + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() * 1); - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - return super.onSpawnWithEgg(data); - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } -} diff --git a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java b/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java deleted file mode 100644 index 82ac62ce8..000000000 --- a/src/main/java/com/hbm/entity/mob/siege/EntitySiegeZombie.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.hbm.entity.mob.siege; - -import api.hbm.entity.IRadiationImmune; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.world.World; - -public class EntitySiegeZombie extends EntityMob implements IRadiationImmune { - - public EntitySiegeZombie(World world) { - super(world); - this.getNavigator().setBreakDoors(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(3, new EntityAIMoveTowardsRestriction(this, 1.0D)); - this.tasks.addTask(4, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(5, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.6F, 1.8F); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float damage) { - - if(this.isEntityInvulnerable()) - return false; - - SiegeTier tier = this.getTier(); - - if(tier.fireProof && source.isFireDamage()) { - this.extinguish(); - return false; - } - - if(tier.noFall && source == DamageSource.fall) - return false; - - //noFF can't be harmed by other mobs - if(tier.noFriendlyFire && source instanceof EntityDamageSource && !(((EntityDamageSource) source).getEntity() instanceof EntityPlayer)) - return false; - - damage -= tier.dt; - - if(damage < 0) { - worldObj.playSoundAtEntity(this, "random.break", 5F, 1.0F + rand.nextFloat() * 0.5F); - return false; - } - - damage *= (1F - tier.dr); - - return super.attackEntityFrom(source, damage); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.getDataWatcher().addObject(12, (int) 0); - this.getDataWatcher().addObject(13, (byte) 0); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - public void setTier(SiegeTier tier) { - this.getDataWatcher().updateObject(12, tier.id); - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).applyModifier(new AttributeModifier("Tier Speed Mod", tier.speedMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).applyModifier(new AttributeModifier("Tier Damage Mod", tier.damageMod, 1)); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(tier.health); - this.setHealth(this.getMaxHealth()); - } - - public SiegeTier getTier() { - SiegeTier tier = SiegeTier.tiers[this.getDataWatcher().getWatchableObjectInt(12)]; - return tier != null ? tier : SiegeTier.CLAY; - } - - @Override - protected boolean isAIEnabled() { - return true; - } - - @Override - protected String getLivingSound() { - return "hbm:entity.siegeIdle"; - } - - @Override - protected String getHurtSound() { - return "hbm:entity.siegeHurt"; - } - - @Override - protected String getDeathSound() { - return "hbm:entity.siegeDeath"; - } - - @Override - protected void dropFewItems(boolean byPlayer, int fortune) { - - if(byPlayer) { - for(ItemStack drop : this.getTier().dropItem) { - this.entityDropItem(drop.copy(), 0F); - } - } - } - - @Override - public void onUpdate() { - - super.onUpdate(); - if(!worldObj.isRemote) { - this.dataWatcher.updateObject(13, (byte)(this.getAttackTarget() != null ? 1 : 0)); - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbt) { - super.writeEntityToNBT(nbt); - nbt.setInteger("siegeTier", this.getTier().id); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbt) { - super.readEntityFromNBT(nbt); - this.setTier(SiegeTier.tiers[nbt.getInteger("siegeTier")]); - } - - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { - this.setTier(SiegeTier.tiers[rand.nextInt(SiegeTier.getLength())]); - return super.onSpawnWithEgg(data); - } -} \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index 16bc6378b..4a61981ff 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -141,7 +141,7 @@ public class Mats { public static final NTMMaterial MAT_DURA = makeSmeltable(_AS + 3, DURA, 0x183039, 0x030B0B, 0x376373).setAutogen(BOLT, DUST, PLATE, CASTPLATE, PIPE, BLOCK, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER, GRIP).m(); public static final NTMMaterial MAT_DESH = makeSmeltable(_AS + 12, DESH, 0xFF6D6D, 0x720000, 0xF22929).setAutogen(DUST, CASTPLATE, BLOCK, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, STOCK, GRIP).m(); public static final NTMMaterial MAT_STAR = makeSmeltable(_AS + 5, STAR, 0xCCCCEA, 0x11111A, 0xA5A5D3).setAutogen(DUST, DENSEWIRE, BLOCK).m(); - public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(HEAVYBARREL, HEAVYRECEIVER).m(); + public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setAutogen(CASTPLATE, HEAVYBARREL, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setAutogen(DUST, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setAutogen(CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT, LIGHTBARREL, HEAVYBARREL, LIGHTRECEIVER, HEAVYRECEIVER).m(); public static final NTMMaterial MAT_BBRONZE = makeSmeltable(_AS + 16, BBRONZE, 0xE19A69, 0x485353, 0x987D65).setAutogen(CASTPLATE, LIGHTBARREL, LIGHTRECEIVER).m(); diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index e4e576ef2..c9aaeb836 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -625,34 +625,31 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.turret_chekhov, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 3), - new ComparableStack(ModItems.mechanism_rifle_2, 1), + new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_friendly, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.BASIC), new OreDictStack(STEEL.pipe(), 3), - new ComparableStack(ModItems.mechanism_rifle_1, 1), + new OreDictStack(GUNMETAL.mechanism(), 1), new ComparableStack(ModBlocks.crate_iron, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_jeremy, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(STEEL.shell(), 3), - new ComparableStack(ModItems.mechanism_launcher_2, 1), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); @@ -664,42 +661,39 @@ public class AssemblerRecipes extends SerializableRecipe { new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new ComparableStack(ModItems.motor_desh, 1), new OreDictStack(CU.ingot(), 32), - new ComparableStack(ModItems.mechanism_special, 1), + new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.battery_lithium, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_richard, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(ANY_PLASTIC.ingot(), 2), new OreDictStack(STEEL.shell(), 8), - new ComparableStack(ModItems.mechanism_launcher_2, 1), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_howard, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 24), - new OreDictStack(DURA.ingot(), 6), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.motor_desh, 2), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 10), - new ComparableStack(ModItems.mechanism_rifle_2, 2), + new OreDictStack(WEAPONSTEEL.mechanism(), 3), new ComparableStack(ModBlocks.crate_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_maxwell, 1), new AStack[] { new ComparableStack(ModBlocks.machine_lithium_battery, 1), new OreDictStack(STEEL.ingot(), 24), - new OreDictStack(DURA.ingot(), 6), new ComparableStack(ModItems.motor, 2), new ComparableStack(ModItems.circuit, 2, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 4), - new ComparableStack(ModItems.mechanism_special, 3), + new OreDictStack(BIGMT.mechanism(), 3), new ComparableStack(ModItems.magnetron, 16), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 8), new ComparableStack(ModItems.crt_display, 1) @@ -707,33 +701,30 @@ public class AssemblerRecipes extends SerializableRecipe { makeRecipe(new ComparableStack(ModBlocks.turret_fritz, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 16), - new OreDictStack(DURA.ingot(), 4), new ComparableStack(ModItems.motor, 3), new ComparableStack(ModItems.circuit, 1, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 8), - new ComparableStack(ModItems.mechanism_launcher_1, 1), + new OreDictStack(GUNMETAL.mechanism(), 3), new ComparableStack(ModBlocks.barrel_steel, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_arty, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), - new OreDictStack(DURA.ingot(), 32), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 3, EnumCircuitType.ADVANCED), new OreDictStack(STEEL.pipe(), 12), - new ComparableStack(ModItems.mechanism_launcher_2, 3), + new OreDictStack(WEAPONSTEEL.mechanism(), 16), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 200); makeRecipe(new ComparableStack(ModBlocks.turret_himars, 1), new AStack[] { new ComparableStack(ModBlocks.machine_battery, 1), new OreDictStack(STEEL.ingot(), 128), - new OreDictStack(DURA.ingot(), 64), new OreDictStack(ANY_PLASTIC.ingot(), 64), new ComparableStack(ModItems.motor_desh, 5), new ComparableStack(ModItems.circuit, 8, EnumCircuitType.ADVANCED), - new ComparableStack(ModItems.mechanism_launcher_2, 5), + new OreDictStack(BIGMT.mechanism(), 8), new ComparableStack(ModBlocks.machine_radar, 1), new ComparableStack(ModItems.crt_display, 1) }, 300); diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index c5d5c95bb..cba9cb424 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -74,6 +74,15 @@ public class PedestalRecipes extends SerializableRecipe { new ComparableStack(ModItems.item_secret, 4, EnumSecretType.SELENIUM_STEEL), new ComparableStack(ModItems.item_secret, 2, EnumSecretType.CONTROLLER), new ComparableStack(ModItems.item_secret, 4, EnumSecretType.SELENIUM_STEEL)) .extra(PedestalExtraCondition.FULL_MOON)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.gun_aberrator), + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new OreDictStack(BIGMT.mechanism(), 4), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.gun_aberrator_eott), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new OreDictStack(BIGMT.mechanism(), 16), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), + new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR))); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 1, EnumAmmoSecret.FOLLY_SM.ordinal()), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new ComparableStack(ModBlocks.moon_turf), new ComparableStack(ModItems.powder_magic), @@ -84,6 +93,10 @@ public class PedestalRecipes extends SerializableRecipe { new ComparableStack(ModItems.powder_magic), new ComparableStack(ModItems.ammo_standard, 4, EnumAmmo.NUKE_HIGH), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1), new ComparableStack(ModItems.powder_magic), new OreDictStack(STAR.ingot(), 1)) .extra(PedestalExtraCondition.FULL_MOON)); + recipes.add(new PedestalRecipe(new ItemStack(ModItems.ammo_secret, 5, EnumAmmoSecret.P35_800.ordinal()), + null, null, null, + null, new ComparableStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR), null, + null, null, null)); } @Override diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 1adbc375b..e832c102a 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -79,7 +79,7 @@ public class ItemEnums { } public static enum EnumSecretType { - CANISTER, CONTROLLER, SELENIUM_STEEL + CANISTER, CONTROLLER, SELENIUM_STEEL, ABERRATOR } public static enum EnumCasingType { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index b712e47a4..a7bf99f5f 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -584,14 +584,6 @@ public class ModItems { public static ItemEnumMulti circuit_star_component; public static Item circuit_star; - public static Item mechanism_revolver_1; - public static Item mechanism_revolver_2; - public static Item mechanism_rifle_1; - public static Item mechanism_rifle_2; - public static Item mechanism_launcher_1; - public static Item mechanism_launcher_2; - public static Item mechanism_special; - public static Item assembly_nuke; public static Item casing; @@ -2830,13 +2822,6 @@ public class ModItems { circuit_star_piece = (ItemEnumMulti) new ItemEnumMulti(ScrapType.class, true, true).setUnlocalizedName("circuit_star_piece").setCreativeTab(null); circuit_star_component = (ItemEnumMulti) new ItemCircuitStarComponent().setUnlocalizedName("circuit_star_component").setCreativeTab(null); circuit_star = new ItemCustomLore().setRarity(EnumRarity.uncommon).setUnlocalizedName("circuit_star").setCreativeTab(null).setTextureName(RefStrings.MODID + ":circuit_star"); - mechanism_revolver_1 = new Item().setUnlocalizedName("mechanism_revolver_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_1"); - mechanism_revolver_2 = new Item().setUnlocalizedName("mechanism_revolver_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_3"); - mechanism_rifle_1 = new Item().setUnlocalizedName("mechanism_rifle_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_2"); - mechanism_rifle_2 = new Item().setUnlocalizedName("mechanism_rifle_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_4"); - mechanism_launcher_1 = new Item().setUnlocalizedName("mechanism_launcher_1").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_5"); - mechanism_launcher_2 = new Item().setUnlocalizedName("mechanism_launcher_2").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_6"); - mechanism_special = new Item().setUnlocalizedName("mechanism_special").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":mechanism_7"); assembly_nuke = new Item().setUnlocalizedName("assembly_nuke").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":assembly_nuke"); casing = new ItemEnumMulti(ItemEnums.EnumCasingType.class, true, true).setUnlocalizedName("casing").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":casing"); @@ -5666,15 +5651,6 @@ public class ModItems { GameRegistry.registerItem(circuit_star_component, circuit_star_component.getUnlocalizedName()); GameRegistry.registerItem(circuit_star, circuit_star.getUnlocalizedName()); - //Gun Mechanisms - GameRegistry.registerItem(mechanism_revolver_1, mechanism_revolver_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_revolver_2, mechanism_revolver_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_rifle_1, mechanism_rifle_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_rifle_2, mechanism_rifle_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_launcher_1, mechanism_launcher_1.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_launcher_2, mechanism_launcher_2.getUnlocalizedName()); - GameRegistry.registerItem(mechanism_special, mechanism_special.getUnlocalizedName()); - //Casing GameRegistry.registerItem(casing, casing.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index b726eff94..03a11681f 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -6,7 +6,8 @@ import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; - import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; +import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.machine.Floodlight.TileEntityFloodlight; import com.hbm.blocks.machine.MachineFan.TileEntityFan; import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; @@ -201,6 +202,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFloodlight.class, new RenderFloodlight()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLoot.class, new RenderLoot()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPedestal.class, new RenderPedestalTile()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySkeletonHolder.class, new RenderSkeletonHolder()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBobble.class, new RenderBobble()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySnowglobe.class, new RenderSnowglobe()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPlushie.class, new RenderPlushie()); @@ -740,10 +742,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityRADBeast.class, new RenderRADBeast()); RenderingRegistry.registerEntityRenderingHandler(EntityBlockSpider.class, new RenderBlockSpider()); RenderingRegistry.registerEntityRenderingHandler(EntityUFO.class, new RenderUFO()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeZombie.class, new RenderSiegeZombie()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeUFO.class, new RenderSiegeUFO()); RenderingRegistry.registerEntityRenderingHandler(EntitySiegeCraft.class, new RenderSiegeCraft()); - RenderingRegistry.registerEntityRenderingHandler(EntitySiegeSkeleton.class, new RenderSiegeSkeleton()); RenderingRegistry.registerEntityRenderingHandler(EntitySiegeTunneler.class, new RenderSiegeTunneler()); RenderingRegistry.registerEntityRenderingHandler(EntityGhost.class, new RenderGhost()); RenderingRegistry.registerEntityRenderingHandler(EntityGlyphid.class, new RenderGlyphid()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 452d1cbe7..c9c6a1eeb 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -351,14 +351,6 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.stamp_desh_flat, 1), new Object[] { "BDB", "DSD", "BDB", 'B', brick, 'D', DESH.ingot(), 'S', FERRO.ingot() }); } - addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_1, 1), new Object[] { "ICI", "CAC", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_revolver_2, 1), new Object[] { "ATA", "TDT", "ATA", 'A', ALLOY.plate(), 'T', W.ingot(), 'D', DURA.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_rifle_1, 1), new Object[] { "ICI", "MAM", "ICI", 'I', IRON.plate(), 'C', CU.ingot(), 'A', AL.ingot(), 'M', ModItems.mechanism_revolver_1 }); - addRecipeAuto(new ItemStack(ModItems.mechanism_rifle_2, 1), new Object[] { "ATA", "MDM", "ATA", 'A', ALLOY.plate(), 'T', W.ingot(), 'D', DURA.ingot(), 'M', ModItems.mechanism_revolver_2 }); - addRecipeAuto(new ItemStack(ModItems.mechanism_launcher_1, 1), new Object[] { "TTT", "SSS", "BBI", 'T', TI.plate(), 'S', STEEL.ingot(), 'B', W.bolt(), 'I', MINGRADE.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_launcher_2, 1), new Object[] { "TTT", "SSS", "BBI", 'T', ALLOY.plate(), 'S', ANY_PLASTIC.ingot(), 'B', W.bolt(), 'I', DESH.ingot() }); - addRecipeAuto(new ItemStack(ModItems.mechanism_special, 1), new Object[] { "PCI", "ISS", "PCI", 'P', ModItems.plate_desh, 'C', ModItems.coil_advanced_alloy, 'I', STAR.ingot(), 'S', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModBlocks.watz_pump, 1), new Object[] { "MPM", "PCP", "PSP", 'M', ModItems.motor_desh, 'P', ANY_RESISTANTALLOY.plateCast(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'S', ModItems.pipes_steel }); addRecipeAuto(new ItemStack(ModBlocks.reinforced_stone, 4), new Object[] { "FBF", "BFB", "FBF", 'F', Blocks.cobblestone, 'B', Blocks.stone }); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 8f7f53640..35e7e03e3 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1666,6 +1666,13 @@ public class MainRegistry { ignoreMappings.add("hbm:item.bobmazon_tools"); ignoreMappings.add("hbm:item.missile_carrier"); ignoreMappings.add("hbm:item.magnet_circular"); + ignoreMappings.add("hbm:item.mechanism_revolver_1"); + ignoreMappings.add("hbm:item.mechanism_revolver_2"); + ignoreMappings.add("hbm:item.mechanism_rifle_1"); + ignoreMappings.add("hbm:item.mechanism_rifle_2"); + ignoreMappings.add("hbm:item.mechanism_launcher_1"); + ignoreMappings.add("hbm:item.mechanism_launcher_2"); + ignoreMappings.add("hbm:item.mechanism_special"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 6f56ba605..51f55b29f 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -349,6 +349,9 @@ public class ResourceManager { public static IModelCustomNamed silo_hatch_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch_large.obj")).asVBO(); + //Skeleton + public static final IModelCustom skeleton_holder = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/blocks/skeleton_holder.obj"),false).asVBO(); + //Lights public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj")); public static final IModelCustom cage_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/cage_lamp.obj")); @@ -760,6 +763,9 @@ public class ResourceManager { public static final ResourceLocation transition_seal_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/transition_seal.png"); public static final ResourceLocation fire_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/fire_door.png"); + //Skeleton + public static final ResourceLocation skeleton_holder_tex = new ResourceLocation(RefStrings.MODID, "textures/particle/skeleton.png"); + //Lantern public static final ResourceLocation lantern_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/lantern.png"); public static final ResourceLocation lantern_rusty_tex = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/lantern_rusty.png"); diff --git a/src/main/java/com/hbm/render/entity/mob/RenderGhost.java b/src/main/java/com/hbm/render/entity/mob/RenderGhost.java index 98c1484a9..812107d0c 100644 --- a/src/main/java/com/hbm/render/entity/mob/RenderGhost.java +++ b/src/main/java/com/hbm/render/entity/mob/RenderGhost.java @@ -4,8 +4,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.entity.mob.EntityGhost; import com.hbm.lib.RefStrings; -import com.hbm.render.model.ModelSiegeZombie; +import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.RenderBiped; import net.minecraft.entity.Entity; @@ -15,7 +15,7 @@ import net.minecraft.util.ResourceLocation; public class RenderGhost extends RenderBiped { public RenderGhost() { - super(new ModelSiegeZombie(0.0F), 0.5F, 1.0F); + super(new ModelBiped(0.0F), 0.5F, 1.0F); } @Override diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java deleted file mode 100644 index 932e739ec..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeSkeleton.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hbm.render.entity.mob; - -import com.hbm.entity.mob.siege.EntitySiegeSkeleton; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; - -import net.minecraft.client.model.ModelSkeleton; -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeSkeleton extends RenderBiped { - - public RenderSiegeSkeleton() { - super(new ModelSkeleton() { - - @Override - public void setLivingAnimations(EntityLivingBase entity, float f0, float f1, float f2) { - this.aimedBow = true; - } - }, 0.5F); - } - - @Override - protected ResourceLocation getEntityTexture(EntityLiving entity) { - return this.getEntityTexture((EntitySiegeSkeleton) entity); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeSkeleton) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeSkeleton entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/siege_" + tier.name + ".png"); - } -} diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java deleted file mode 100644 index ad9ad0793..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeUFO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hbm.render.entity.mob; - -import org.lwjgl.opengl.GL11; - -import com.hbm.entity.mob.siege.EntitySiegeUFO; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; -import com.hbm.main.ResourceManager; - -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeUFO extends Render { - - @Override - public void doRender(Entity entity, double x, double y, double z, float f0, float f1) { - - GL11.glPushMatrix(); - GL11.glTranslated(x, y + 0.25, z); - - EntitySiegeUFO ufo = (EntitySiegeUFO) entity; - - this.bindTexture(getEntityTexture(entity)); - - double rot = (entity.ticksExisted + f1) * 5 % 360D; - GL11.glRotated(rot, 0, 1, 0); - - - if(!ufo.isEntityAlive()) { - float tilt = ufo.deathTime + f1; - GL11.glRotatef(tilt * 5, 1, 0, 1); - } else if(entity.hurtResistantTime > 0) { - GL11.glRotated(Math.sin(System.currentTimeMillis() * 0.01D) * (entity.hurtResistantTime - f1), 1, 0, 0); - } - - GL11.glShadeModel(GL11.GL_SMOOTH); - GL11.glDisable(GL11.GL_CULL_FACE); - ResourceManager.mini_ufo.renderAll(); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glShadeModel(GL11.GL_FLAT); - - GL11.glPopMatrix(); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeUFO) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeUFO entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/ufo_siege_" + tier.name + ".png"); - } -} diff --git a/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java b/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java deleted file mode 100644 index 679d0a9d7..000000000 --- a/src/main/java/com/hbm/render/entity/mob/RenderSiegeZombie.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hbm.render.entity.mob; - -import com.hbm.entity.mob.siege.EntitySiegeZombie; -import com.hbm.entity.mob.siege.SiegeTier; -import com.hbm.lib.RefStrings; -import com.hbm.render.model.ModelSiegeZombie; - -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.util.ResourceLocation; - -public class RenderSiegeZombie extends RenderBiped { - - public RenderSiegeZombie() { - super(new ModelSiegeZombie(0.0F), 0.5F, 1.0F); - } - - @Override - protected ResourceLocation getEntityTexture(EntityLiving entity) { - return this.getEntityTexture((EntitySiegeZombie) entity); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return this.getEntityTexture((EntitySiegeZombie) entity); - } - - protected ResourceLocation getEntityTexture(EntitySiegeZombie entity) { - SiegeTier tier = entity.getTier(); - return new ResourceLocation(RefStrings.MODID + ":textures/entity/siege_" + tier.name + ".png"); - } - - @Override - protected void func_82421_b() { - this.field_82423_g = new ModelSiegeZombie(1.0F); //armor slots 1, 2, 4 - this.field_82425_h = new ModelSiegeZombie(0.5F); //armor slot 3 - } -} diff --git a/src/main/java/com/hbm/render/model/ModelSiegeZombie.java b/src/main/java/com/hbm/render/model/ModelSiegeZombie.java deleted file mode 100644 index 76bd7c883..000000000 --- a/src/main/java/com/hbm/render/model/ModelSiegeZombie.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.hbm.render.model; - -import com.hbm.entity.mob.siege.EntitySiegeZombie; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelSiegeZombie extends ModelBiped { - - public ModelSiegeZombie(float p_i1168_1_) { - super(p_i1168_1_, 0.0F, 64, 32); - } - - public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_, float p_78087_5_, float p_78087_6_, Entity entity) { - super.setRotationAngles(p_78087_1_, p_78087_2_, p_78087_3_, p_78087_4_, p_78087_5_, p_78087_6_, entity); - - if(entity instanceof EntitySiegeZombie && ((EntitySiegeZombie)entity).getDataWatcher().getWatchableObjectByte(13) != 0) { - float f6 = MathHelper.sin(this.onGround * (float) Math.PI); - float f7 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float) Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float) Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float) Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; - } - } -} diff --git a/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java b/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java index 6f39d7389..76c606e18 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPedestalTile.java @@ -37,10 +37,6 @@ public class RenderPedestalTile extends TileEntitySpecialRenderer { if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { GL11.glTranslated(0, 0.125, 0); GL11.glRotatef(player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * interp + 180, 0.0F, -1.0F, 0.0F); - - if(!RenderManager.instance.options.fancyGraphics) { - GL11.glRotatef(180F, 0.0F, 1.0F, 0.0F); - } GL11.glTranslated(0, Math.sin((player.ticksExisted + interp) * 0.1) * 0.0625, 0); } else { diff --git a/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java new file mode 100644 index 000000000..c40bf33c4 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderSkeletonHolder.java @@ -0,0 +1,72 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; +import com.hbm.items.weapon.sedna.ItemGunBaseNT; +import com.hbm.main.ResourceManager; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +public class RenderSkeletonHolder extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + + switch(te.getBlockMetadata()) { + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + } + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + RenderHelper.enableStandardItemLighting(); + + bindTexture(ResourceManager.skeleton_holder_tex); + ResourceManager.skeleton_holder.renderPart("Holder1"); + + TileEntitySkeletonHolder pedestal = (TileEntitySkeletonHolder) te; + + if(pedestal.item != null) { + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack stack = pedestal.item.copy(); + + GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F); + + if(stack.getItem() instanceof ItemGunBaseNT) { + GL11.glRotatef(-90F, 0.0F, 1.0F, 0.0F); + } + + if(!(stack.getItemSpriteNumber() == 0 && stack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(stack.getItem()).getRenderType()))) { + GL11.glScaled(1.5, 1.5, 1.5); + } + + GL11.glTranslated(0, 0.125, 0); + + EntityItem dummy = new EntityItem(te.getWorldObj(), 0, 0, 0, stack); + dummy.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index d383cdd29..16b57c2ec 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -14,6 +14,7 @@ import com.hbm.blocks.generic.BlockGlyphidSpawner.TileEntityGlpyhidSpawner; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; +import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; @@ -212,6 +213,7 @@ public class TileMappings { put(TileEntityLoot.class, "tileentity_ntm_loot"); put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); + put(TileEntitySkeletonHolder.class, "tileentity_ntm_skeleton"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); put(TileEntitySnowglobe.class, "tileentity_ntm_snowglobe"); put(TileEntityPlushie.class, "tileentity_ntm_plushie"); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 401f3fcaa..9d6a1ae4b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2447,6 +2447,7 @@ item.insert_polonium.name=Poloniumeinlage item.insert_steel.name=Schwere Stahleinlage item.insert_xsapi.name=XSAPI-Einlage item.insert_yharonite.name=Yharoniteinlage +item.item_secret.aberrator.name=Aberrator-Teil item.item_secret.canister.name=Komposit SB-26 item.item_secret.controller.name=Proprietäre Steuereinheit item.item_secret.selenium_steel.name=Selen-Stahl @@ -4889,6 +4890,7 @@ tile.sellafield_slaked.name=Gelöschtes Sellafit tile.semtex.name=Semtex tile.silo_hatch.name=Siloluke tile.silo_hatch_large.name=Große Siloluke +tile.skeleton_holder.name=Oh, ich glaub' der ist tot tile.sliding_blast_door.name=Sprengtür tile.solar_mirror.name=Heliostatspiegel tile.soyuz_capsule.name=Landekapsel diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c8df9b7ef..25e9ef98a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3270,6 +3270,7 @@ item.insert_polonium.name=Polonium Insert item.insert_steel.name=Heavy Steel Insert item.insert_xsapi.name=XSAPI Insert item.insert_yharonite.name=Yharonite Insert +item.item_secret.aberrator.name=Aberrator Part item.item_secret.canister.name=Composition SB-26 item.item_secret.controller.name=Proprietary Control Unit item.item_secret.selenium_steel.name=Selenium Steel @@ -6034,6 +6035,7 @@ tile.sellafield_slaked.name=Slaked Sellafite tile.semtex.name=Semtex tile.silo_hatch.name=Silo Hatch tile.silo_hatch_large.name=Large Silo Hatch +tile.skeleton_holder.name=Oh, that's a dead guy tile.sliding_blast_door.name=Sliding Blast Door tile.solar_mirror.name=Heliostat Mirror tile.soyuz_capsule.name=Cargo Landing Capsule diff --git a/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj b/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj new file mode 100644 index 000000000..8b874c6c3 --- /dev/null +++ b/src/main/resources/assets/hbm/models/blocks/skeleton_holder.obj @@ -0,0 +1,330 @@ +# Blender v2.79 (sub 0) OBJ File: 'skeleton_holder.blend' +# www.blender.org +o Holder1 +v -0.007506 0.185094 0.287769 +v -0.369728 0.834613 0.384826 +v -0.039858 0.185094 0.167028 +v -0.402080 0.834613 0.264085 +v 0.097059 0.247594 0.259751 +v -0.265163 0.897113 0.356808 +v 0.064706 0.247594 0.139010 +v -0.297516 0.897113 0.236067 +v 0.365620 0.000000 -0.258745 +v -0.358824 0.000000 -0.064630 +v 0.333268 0.000000 -0.379485 +v -0.391176 0.000000 -0.185371 +v 0.365620 0.125000 -0.258745 +v -0.358824 0.125000 -0.064630 +v 0.333268 0.125000 -0.379485 +v -0.391176 0.125000 -0.185371 +v -0.491581 1.016218 0.267475 +v -0.205884 1.425794 0.242480 +v -0.535159 1.016218 -0.230622 +v -0.249462 1.425794 -0.255617 +v -0.083563 0.729430 0.231779 +v 0.202134 1.139006 0.206783 +v -0.127141 0.729430 -0.266319 +v 0.158556 1.139006 -0.291314 +v -0.491581 1.016218 0.267475 +v -0.205884 1.425794 0.242480 +v -0.535159 1.016218 -0.230622 +v -0.249462 1.425794 -0.255617 +v -0.083563 0.729430 0.231779 +v 0.202134 1.139006 0.206783 +v -0.127141 0.729430 -0.266319 +v 0.158556 1.139006 -0.291314 +v -0.250476 0.114105 0.250000 +v -0.185109 0.861251 0.250000 +v -0.250476 0.114105 -0.250000 +v -0.185109 0.861251 -0.250000 +v -0.499524 0.135894 0.250000 +v -0.434158 0.883040 0.250000 +v -0.499524 0.135894 -0.250000 +v -0.434158 0.883040 -0.250000 +v -0.250476 0.114105 0.250000 +v -0.185109 0.861251 0.250000 +v -0.250476 0.114105 -0.250000 +v -0.185109 0.861251 -0.250000 +v -0.499524 0.135894 0.250000 +v -0.434158 0.883040 0.250000 +v -0.499524 0.135894 -0.250000 +v -0.434158 0.883040 -0.250000 +v 0.333268 -0.000000 0.379485 +v -0.391176 0.000000 0.185371 +v 0.365620 -0.000000 0.258745 +v -0.358824 0.000000 0.064630 +v 0.333268 0.125000 0.379485 +v -0.391176 0.125000 0.185371 +v 0.365620 0.125000 0.258745 +v -0.358824 0.125000 0.064630 +v -0.039858 0.185094 -0.167028 +v -0.402080 0.834613 -0.264085 +v -0.007506 0.185094 -0.287769 +v -0.369728 0.834613 -0.384826 +v 0.064706 0.247594 -0.139010 +v -0.297516 0.897113 -0.236067 +v 0.097059 0.247594 -0.259751 +v -0.265163 0.897113 -0.356808 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt -0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.031250 0.437500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.093750 0.062500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt 0.031250 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.750000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt -0.000000 0.500000 +vt 0.250000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.500000 0.500000 +vt 0.375000 0.750000 +vt 0.500000 0.750000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.250000 0.750000 +vt -0.000000 0.500000 +vt 0.125000 0.750000 +vt 0.375000 1.000000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.312500 0.000000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.625000 0.000000 +vt 0.500000 0.375000 +vt 0.312500 0.000000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.437500 0.500000 +vt 0.562500 0.375000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.312500 0.375000 +vt 0.437500 0.375000 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.375000 +vt 0.500000 0.000000 +vt 0.437500 0.000000 +vt 0.500000 0.375000 +vt 0.625000 0.000000 +vt 0.250000 0.375000 +vt 0.312500 0.000000 +vt 0.250000 0.000000 +vt 0.562500 0.375000 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.312500 0.375000 +vt 0.312500 0.500000 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.437500 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.031250 0.062500 +vt -0.000000 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.031250 0.437500 +vt 0.125000 0.437500 +vt 0.093750 0.062500 +vt 0.125000 0.062500 +vt 0.062500 0.437500 +vt 0.062500 0.062500 +vt 0.031250 0.062500 +vt 0.031250 0.437500 +vt 0.000000 0.062500 +vt 0.062500 0.500000 +vt 0.093750 0.437500 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vt 0.125000 0.437500 +vt -0.000000 0.437500 +vt 0.093750 0.437500 +vt 0.031250 0.500000 +vt 0.500000 0.750000 +vt -0.000000 0.750000 +vt 0.375000 0.750000 +vt 0.125000 1.000000 +vt -0.000000 0.750000 +vt 0.375000 0.750000 +vt 0.125000 1.000000 +vt 0.312500 0.375000 +vt 0.625000 0.375000 +vt 0.437500 0.375000 +vt 0.312500 0.500000 +vt 0.312500 0.375000 +vt 0.625000 0.375000 +vt 0.437500 0.375000 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vt 0.093750 0.437500 +vt -0.000000 0.437500 +vt 0.062500 0.437500 +vt 0.031250 0.500000 +vn -0.8365 -0.5000 0.2241 +vn -0.2588 -0.0000 -0.9659 +vn 0.8365 0.5000 -0.2241 +vn 0.2588 0.0000 0.9659 +vn 0.4830 -0.8660 -0.1294 +vn -0.4830 0.8660 0.1294 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.9659 0.0000 -0.2588 +vn -0.9659 0.0000 0.2588 +vn -0.8160 0.5736 0.0714 +vn -0.0872 -0.0000 -0.9962 +vn 0.8160 -0.5736 -0.0714 +vn 0.0872 0.0000 0.9962 +vn -0.5714 -0.8192 0.0500 +vn 0.5714 0.8192 -0.0500 +vn 0.9962 -0.0872 0.0000 +vn 0.0000 -0.0000 -1.0000 +vn -0.9962 0.0872 0.0000 +vn -0.0000 0.0000 1.0000 +vn -0.0872 -0.9962 0.0000 +vn 0.0872 0.9962 0.0000 +vn 0.2588 0.0000 -0.9659 +vn -0.2588 0.0000 0.9659 +vn 0.9659 0.0000 0.2588 +vn -0.9659 0.0000 -0.2588 +vn -0.8365 -0.5000 -0.2241 +vn 0.8365 0.5000 0.2241 +vn 0.4830 -0.8660 0.1294 +vn -0.4830 0.8660 -0.1294 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/2/2 +f 8/6/3 5/7/3 7/5/3 +f 5/7/4 2/8/4 1/9/4 +f 3/10/5 5/11/5 1/12/5 +f 4/13/6 6/14/6 8/6/6 +f 9/15/7 12/16/7 11/17/7 +f 12/16/2 15/18/2 11/17/2 +f 16/19/8 13/20/8 15/18/8 +f 14/21/4 9/22/4 13/20/4 +f 15/23/9 9/24/9 11/25/9 +f 12/26/10 14/21/10 16/19/10 +f 17/27/11 20/28/11 19/29/11 +f 20/28/12 23/30/12 19/29/12 +f 24/31/13 21/32/13 23/30/13 +f 22/33/14 17/34/14 21/32/14 +f 23/35/15 17/36/15 19/37/15 +f 20/38/16 22/33/16 24/31/16 +f 25/39/13 28/40/13 26/41/13 +f 31/42/14 28/40/14 27/43/14 +f 29/44/11 32/45/11 31/42/11 +f 25/46/12 30/47/12 29/44/12 +f 25/48/16 31/49/16 27/50/16 +f 30/47/15 28/51/15 32/45/15 +f 35/52/17 34/53/17 33/54/17 +f 39/55/18 36/56/18 35/57/18 +f 37/58/19 40/59/19 39/55/19 +f 33/60/20 38/61/20 37/62/20 +f 33/63/21 39/64/21 35/65/21 +f 40/66/22 34/67/22 36/56/22 +f 42/68/19 43/69/19 41/70/19 +f 44/71/20 47/72/20 43/73/20 +f 48/74/17 45/75/17 47/72/17 +f 46/76/18 41/77/18 45/78/18 +f 47/79/22 41/80/22 43/81/22 +f 48/82/21 42/83/21 46/84/21 +f 50/85/7 51/86/7 49/87/7 +f 52/88/23 55/89/23 51/86/23 +f 56/90/8 53/91/8 55/89/8 +f 53/91/24 50/92/24 49/93/24 +f 51/94/25 53/95/25 49/96/25 +f 52/97/26 54/98/26 56/90/26 +f 58/99/27 59/100/27 57/101/27 +f 59/100/23 64/102/23 63/103/23 +f 64/102/28 61/104/28 63/103/28 +f 62/105/24 57/106/24 61/104/24 +f 59/107/29 61/108/29 57/109/29 +f 60/110/30 62/105/30 64/102/30 +f 2/1/1 4/4/1 3/2/1 +f 4/4/2 8/6/2 7/5/2 +f 8/6/3 6/14/3 5/7/3 +f 5/7/4 6/14/4 2/8/4 +f 3/10/5 7/111/5 5/11/5 +f 4/13/6 2/112/6 6/14/6 +f 9/15/7 10/113/7 12/16/7 +f 12/16/2 16/19/2 15/18/2 +f 16/19/8 14/21/8 13/20/8 +f 14/21/4 10/114/4 9/22/4 +f 15/23/9 13/115/9 9/24/9 +f 12/26/10 10/116/10 14/21/10 +f 17/27/11 18/117/11 20/28/11 +f 20/28/12 24/31/12 23/30/12 +f 24/31/13 22/33/13 21/32/13 +f 22/33/14 18/118/14 17/34/14 +f 23/35/15 21/119/15 17/36/15 +f 20/38/16 18/120/16 22/33/16 +f 25/39/13 27/43/13 28/40/13 +f 31/42/14 32/45/14 28/40/14 +f 29/44/11 30/47/11 32/45/11 +f 25/46/12 26/121/12 30/47/12 +f 25/48/16 29/122/16 31/49/16 +f 30/47/15 26/123/15 28/51/15 +f 35/52/17 36/124/17 34/53/17 +f 39/55/18 40/59/18 36/56/18 +f 37/58/19 38/125/19 40/59/19 +f 33/60/20 34/67/20 38/61/20 +f 33/63/21 37/126/21 39/64/21 +f 40/66/22 38/127/22 34/67/22 +f 42/68/19 44/128/19 43/69/19 +f 44/71/20 48/74/20 47/72/20 +f 48/74/17 46/129/17 45/75/17 +f 46/76/18 42/83/18 41/77/18 +f 47/79/22 45/130/22 41/80/22 +f 48/82/21 44/71/21 42/83/21 +f 50/85/7 52/88/7 51/86/7 +f 52/88/23 56/90/23 55/89/23 +f 56/90/8 54/98/8 53/91/8 +f 53/91/24 54/98/24 50/92/24 +f 51/94/25 55/131/25 53/95/25 +f 52/97/26 50/132/26 54/98/26 +f 58/99/27 60/133/27 59/100/27 +f 59/100/23 60/133/23 64/102/23 +f 64/102/28 62/105/28 61/104/28 +f 62/105/24 58/134/24 57/106/24 +f 59/107/29 63/135/29 61/108/29 +f 60/110/30 58/136/30 62/105/30 diff --git a/src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png b/src/main/resources/assets/hbm/textures/blocks/dungeon_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..66c1990fc7dba704f3db66eb219fb67ea98f6bf1 GIT binary patch literal 714 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 Hu0mjf#&KdD diff --git a/src/main/resources/assets/hbm/textures/entity/siege_desh.png b/src/main/resources/assets/hbm/textures/entity/siege_desh.png deleted file mode 100644 index 21e5cea377403e3bcd4b625bb6b9d2ecbe4cda13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmVcwgpl57DKAwQv-ai-+ zkI17Kb`$VWDjslhg02!6m6~%-Fe)|QyAGblympH_F6|ROeg`zUcL0Yfc0h{=ts`c1 zTr<2~;NEqw-;=d45~X*?G`2Pb+u-ss?gz%=21LFko)D}LsBu+O;MIW1+9Zcp>*@ml z{83=8D{!iv`~JY^D^lL45Osk8@zkDwPkv$})N8$If_GtSej)-MN}XB^_vDv+7Rcco z-J0fVT#}!wIh-c!J`R__WG(bs!_ye=bE)70R7wEAFA1S%Qe?RiqARd$<&aYMu)bJv zS2$J%N9fY(G#G0op+tOEIh0t)R>$H)+nm#f9vTwY`M_JPOq8UT>zIm)sGV=TH(IQa}nLT3PlMPxuzS7_?WI9@UayFi}jKhHu4 zq*>9MSI4^T(qL?Z-N&dOXtR@2k}dHVLF#}dp6VD3a)1zGl)_u;=>xzY2Bx|K#o9yv z5A?C``&At=cD)X#E+C~mYR&KCpR*9+oKM=|P?+kUQveuaM@@!4{*As1giwxZO;a`Q z;-AVn6eoCJhhsnp0nRzfvK*XuC0t;k0RVo3V48D9kUv8D33RD!V`??s)f2Xr!5qBQ zyA8TJsA5Pen;bLAYMZ?&%_)B9zU6cOWaWTf0BpKHRu>o>G=1If{?0n zDeG!K7d9>%Pm!5ALz`-uvJV}IWc%>kD}f diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_buff.png deleted file mode 100644 index bf5c5145ce6ab82e25ed65dc107f35d25476c926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmV;519kj~P)HLy(l?p1OuhjvMQQ`NCTe4yVqX4coGdI zU_8u0a}kA}dg!U(Mf?ZSBDe~IRHU&IFD)27C3?weO|7sV%C6aUlgy88W@nQREac6; zS!Uk6`R>eQHS|CTaX5L(z~1>_ zoqA&jA3lCYI+KaAZ6hJY(|H#{h~swJw(ZCoHA?g-9%9bry(yp?!T|_&I;aUQ{cPEq z5lIHr8#@4i%a_h$zuRT9Ws?$pKu`l%ZP`Sw0qIPJ$(D_90BWz^VJfZT*wJa&wvAtV zf0%692nXQC>Zazrxaaf=8mldnNTz`G_B|ZO;kIQWEP?<~xOfg%ubAAnOj05n8@KM} zRs)~D?0V&_woKf;0CNy}>nvO=z?{p2*OrN=0fZ2ZcRQ@I22gi8u85vZ=($|ZSI}%W z5iA>YPqx1(k-P;|M!RtTgwj)B>)B7SDPWvE5>;E2L|>eK-27=sR0i-c34rVd z$VOkYANos90&n{LVH0*wvj4)5+kI}*p?j|uRXHwJT@Na&?EU@ZOmM{LVNo0u*|_BMHfKI0)yA4ti{!GqQVpY)r zfL8~SkUbL(=rw3ZG)ZrcNIsPv6{SiwbkX+o@dIuh3Y`LmVT4{X>DT#T_lBW_2GDen zHwdv0087Vsf)M)v95#`QV5w4dW@qxKt#9De=`&#cEh1<P-KNCGWxSKqyL0H zk_;$Ss*cF3NG6(TnvTd`;QGy5zOwJ%zH*O#ZG8hTpRfL>0kpy8(GMjwfTm--;u-rh g!QSomVJwCJ0;Z~-nb^GC0{{R307*qoM6N<$f}^OOOaK4? diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_clay.png deleted file mode 100644 index a62854104041739f69f4ac84aaf456b25bc0294b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925 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 diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_iron.png deleted file mode 100644 index 72ac3298e2eedfbb758825115740c4f145972245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmV-+1Bv{JP)a8+iJ};I?H_5ZT!HWv{gh+f# zz;HN3qtO6>;C&xi^Jhi*2ms=HnPrum3jsvfdmz&5^#HJkoJ@byG^y*ln(MlO&2rD! z2(T;*mSr(jEQ|iE7gpi$!HqZ08^UzKK;(A!-n2&3`{~fOgO5}ijjZfmUi_8muxEFkwSW>ifTdx)3!%)P35K`Zcd-=y2N@@W2XAtsO01T{@{~! zn(Y&OIR1=$p^#1Z>r6T)#+_|EOMO+2y7tV7FSu zM!nA5K;8UV7&!&#P+QvH|67n)E_L&FT{rZ7pZLBX*{KiwN9qXJt5lHOCz#~VLh38A zje7k&;|!?wr@hYF`#?$pBC%o2xNiQe7{3pYWtsrh4N#3mcUY#fy0ary-=gcQsjSY= zOVziMTT9jF`{_HuF=GwOVp?W(^Ot4deH!l{Ms)KB&d&ra^#F47xYBP!j%_60sxNV2o3*cvuS*NB3gM;xbjoLvTa*+ z8Cfb-5}S$z0HQiD38QDK0da%1M<;3J$mCPmapA6P4&Ai*Z=MP3 z(9kJh+xE~)C8L7B=-x#bp#dxbiY7t(1n>kVk_7D&aM@%og6_&@I6LQ{b$p1Mw@Tps zSw_%An2vy9g)%!lncknB8~;C1WHJKWmCaCQDN+e>94C}H3)r`p2g<&G>j?LL>-Z3@ z#;gA{fHk=y`eB3yummP5p4z_?j32izV=Mdz1Le)6RyDl_00000NkvXXu0mjf!R@RY diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_silver.png deleted file mode 100644 index 8584831caa0ae4df044ab192fd4967ea096ab621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmV-=1BLvFP)!24owLzjgwzBCL4Y6#FdB`} z?RK|b$h3d6+2jD=dET164Pgz~hHd_$q$Z#!^FK~_*G2C>kdXk{d1jlxD21;BbU7x# zbO%i1h&+O9rr+;twRghe;!tstHMQyW{c%5F$2gm^n3Y-E{B>DdLCO9xVw*qkzY6p` zPk5hD`8`3~2$LY2fT$F1G#WTNJBvOyH#e!D*=&YhuV8a^H809zu=JUDfJ{U#&HMvlUi;4pPsyeU_qvxmraYOWu z?$eVamse$X1*LRj(dPTUvJP!bK-wKPIp@=Y55H4QLLoFDD|i{7O<11*nZQ(%V0{Aa zn%omWDdnwJiv!>)$9eZ>8wWoEHa-P()V^M?V>}*%QmS<9`@ZsTtB}hGpp+UJzIi}g z*X25Efz@iYcFy;G<-0!~kAcKiJs_^`Dz!i%G(aRU)k4VnJ;C^L`z}i1e>OJSk4f9z QFaQ7m07*qoM6N<$f)QSsMF0Q* diff --git a/src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png b/src/main/resources/assets/hbm/textures/entity/siege_drill_stone.png deleted file mode 100644 index 4cd317e2d4820b0e272b685756101b1f2b99e72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmV;J184k+P)jGMQlI;d7;uQvm3LkJsrR z9OC_l&nT8kS+;E<6j*`}a9!6Af*y~@nKf#W=vlnP+*k{zfNF3jARcsF69STK(VCIT z2IOC>5>G~5a3?7hWGQOAYz=P(|R@$=Uo zDqA$%3AnejulcVY`%yuowMCN26!6}>gYWyywn(@|5CCe|uHe>9li3zYf#+Zo)ZPDh zfKOk(hUK)jNP@EfbrPa=?%b}y+*kvvEs{_JT-ViDkHac!0CCW=!h1KNS1OgMg5hw8 zcv;$SqWyWvWED^utfWd>Swq45kW1&*@wP7EGQ1(GB1w zzK@w_$4NX5b~>FY+qUi0hREhmO6mx(Z5xi`5Wh^6e^M`#>~a$mVB0nf!=P%MO#Y;# zUWl|>EdYSyIEXKoviVz<<$Io|d7c;Ab6<#*5nvbw)jX5UpOn-QU>F9~uoLYc^g3zp z11Sk08Im&llcM}SfR{W0q8lI@<&VSNZWjO$EPqif%L0&oZKelntEyD1Rj&Gad~Fqd zzR&Li7K}bCi)opa&7YSkaiIOjh;07AzcT?zJ%HmoLD>kBK%0PYD_pD9u)4Y$KBLhn z@i{s=!q(Q7RQ>^$WzAd?lQ{Dtr~!a!noPsL-|s75Ut_JjES&i%pqI;K(QOb)J_3%9 zk43jZDBPdP1xlz~*+-=UIwGqM4@Y^PC0l-hVJv_T&3E=HBmgck%k=&VL#} unp_tBP(lMp0%H|V>F)%i$L-VD3jYO1lfacUp@uU60000-@25IhpPv}SmUKR{*1@Ps_UZ=rXSCt$`@e1NAgFq0}B z8B*a0Mbe!BSt#~aXmp^{>Td6l2MC%x80w;jI7^_bN&o=h$0~$r>!C&#@nYKn+jtUS z+X35ncmn*TAE=9d4L_`5F#-D{@`>}(70lw90!%y}o_W3HXn&Rt5NUqJ}Khel7Tvh3B-Hyh6)z8M8M{g!ldRK1l(Q zqjTC!K1Zqd3cNi=90n~BWEWOBcTZr%VR(ulB7#4FDEa@<;W2vv0000P)Nkloc4Z| zV=UJYZZ0TbfQSnbfiVW0a{vGkj+yrr8`KbgtqHWoF9EFyw8qyb;Bod3i0BF)&2Tya zTI(x#G{bKTAmUPU0z_QKaRh7aRxSRxwNLo^3Q)BxfI}A*fQW#I$#Kt!c7bsmx8KgW zw~zJ5&*u}AQd?|qNVdWCWBg>~;)tlrmdN^m9#^#lQ4Mg;6*;_KS04c2O@X?C;?jQTZ`cte#K{j8qP5|8)WymgrBcD zoF<$;4!3}F4vaBit&KjH3NApW2>|#{Lh6|mRc?gB6N1Z@V#Le7-Hm$~@biBR)A?~F~1=n;hbf_jjWd zfRwJmZhWxq4AC~YEoQ&KlpSb|x5OI))d4;3Y7T-NV3f*Jc%AM(0Kk!fv95rzcJ2Fv zfUd}T-vg}+Xnk+ZU*I2E2=RG7HNmHF)<0SRhT-01Sm0m&S)hV)bZQ!_af*L?&Otb# z{5aeIMyYjy(-eG8CS2$=004hMh&`jC%8k%r2ewp>F|`m*x;s0ZD1$3_$vq9GT1mu_ zkW`L27L(N}`&gQz{IIQMS&|&!1R$mRTXlilp!x3^#^?d~muS`n{BokEEYDMUvUcs}+0*4}p1osoCockoOz+reu5Fx=|Le$it TR0^uO00000NkvXXu0mjfzsu5^ diff --git a/src/main/resources/assets/hbm/textures/entity/siege_silver.png b/src/main/resources/assets/hbm/textures/entity/siege_silver.png deleted file mode 100644 index 1be7bb6fa9dcf3d237ce742e22f0f6228e8aab4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmV<70UrK|P)-s3=I2v5jcTY!HaU0oFF+0`(+m?5Kt+y?R=GIEMrI} zqY4BNkw-+Z)&esF06@Gh!5E{&pn>=qO<**>2^dXaG(J87kF$S(h*$6!hSLdHmgNc_ z!|-hZBJw>qAR@1|2It(fTEg{cpYZV&pn6w;gefY(7z4(b?0RM-r-0V_`J0)6h<4Y* zbsRezvSV<2nD7BhafmqONECg*jHlXyqy{i^lf#?!^Z@`~6j+)Hl4|$Tk|vyf9UcK@ z25T)i=aScJ1s7n_1OWUcA$P47UA_p#C$N=rPN}ulyK)atxYPz$=+f?Ourx|?L{e5c zM=WQnOYylfm-JzKmUUf=8n8=1$@h<%0`L? z&pr1!f1D!&FJHb~lu9L9tropr4*<{eXt&!qjsrjt1Tl_b7?`FB!0Xqqb6Im-C-PYX zN~ID2g+c+_wsBpTVzG#6ngl_BVHmLu3w+=IJ1f3oWE#M>Z9aegOc;hJrLZhZpSWQd z08Azm{cbj!X`}rM$TWabiej;dQc7>q^E{MNdQ7cW)1M8)U^1CtS=N$Q+(cv=AP55H z^Es7D1>3gu`%0yvHws{yrgr;MsYDP2OWJS~k!b+KFqqHh`U(U=faiG}A0J~`7Ov|8 zP%IWTXFi|*y%k?EG7SK5=guAdEM8Er*ZK103-|Be2QIEkE|+7mSP%q(9=E^0f7NTg zQml0aPESwu>5B)1VTff}F)f(QX8QS`i2|KYXCY$cx-PX^4d3^*!UJq=Z7pd)p-{jy zO_Wkv>?V`R62H^wES@}hLbu!1{09#n=+D=kC**;cc*(QG_{n6#`T03v80zml&jZk> zpT!Tukm+=)CmoN+G5&QT4?iJD?jQXfi5hYZBt;h2zbRQ_9)7x~oXmJU*3VM$ znWo9v*;yrXjEP6GWspL2M4i0ir}`w4=m5e4h~ezV!+ z;NUjis@+ZR2?!tyXKT#Km=8ohU{5(SCw#Hrh|{eSfX=*|IDxz`{R0J*C-f z{#N?E?(Qy!hli9^!F3 znz2PsLLx*OU#dr?RBAsV%CA%^05N{GTGjlt`OnVIXf~VF>vaIaFx32BueY`!=GUp` zqm9n!{k1HMqoX4|PVQy9-Hy5Rty{NHO2u-2IkBUoBN~kc8yg#X{^4*Ky9Srduax5C z}XX!K0c;iuhZ>zW7om9ZAPOJySuwf z{4fl090$`hWBmljad`3K1@GU#r(7;C@np@H^&>9JOq0lUI-P}BPV)ZfBwxRNWpi_r z!C(-xu(&5I|1lznc8HVX*5%*5dza14O}$ycXf#^MZ#J8lrpcp6k5-CcuG8r(WV31Y zytrSo&`IK^@-w5rI{kp;q{(_djsNZ2HvsLvS$xrw`FyS;!k^49>(4^|{QNv7PSt94 zsh;Lyd!C_jm01LRlvtyT+&8%$h0SwN*}!_%ivvopacK7Rc8OZ9wO mKjA9*gTX+5_b2mThW`NH$JF-?)4TZmu6b*Y@$d>XGZ$gp4}BQ{!}E#p1b~p`RTt;zxK?&U9`{aQ)1CK215>k#}-?!I58hlaOkP8 zk6!sc@yZ2|D9{-<%@ZZ~q!ic~lQuDx{oOfj&;L1W9gYnWEFFbuX^Jh+Tuhc;SrZO) z16Yj!NTI-o@QQh7H|^)0eEsZfwwPSAot2+X{WO0j{XDnV=vx~wycs-Q{an^LB{Ts5 D($uz! diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_clay.png deleted file mode 100644 index f9736160b73ca5fd503d6a1f6bbc0906be7c2a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pN!3HD)jM6X;vUIcV-%Hc{9u|k zP5s7=OhF6%^4-~Dn|o9~mrDNQX-q8pZkE1gYrMySsO+F;u5)z1@!u#BVUT2XSmyEf z(CrM7yT);=g=J#zWX_KeGHvjg#vqq>Zn9t4>>eoxH^vDk#Tuq9eClDx`uEu1-}hGO zUYF8!OyOZDdEdON-1gGv*Q^W{&mTBf)$L_y*rc=987Oj#`GgM3h4mgQyk^DU-6Q3Y zrr7XK>gn%0?w{-Dn};udd{FrH(>EvY%#-E+k`=}NbwdB2$N!GLJ69IZ&LAW6j{j(; z>=kFbPyN5M`4tv3oT#|2qY$u><9xrq=jTuJ7qd+WWJuX_Tv=hy@AeEkyUEX<+Pm|D z)M+pnW%?fyy!Lg*jN9>GkqYJ&%eH=hdh3Gsc17DK%Kzo%O&fZcKx!ozG)`~Y+gEUI z>+7js{_Fz#6KE_bP(H-(nCG*n{*1@@)!TU`%zN|Ws?z>S^Bj7W$MiZq4j5Amp00i_ I>zopr0P1qd5&!@I diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_desh.png deleted file mode 100644 index ae7851cec912acb3b7578915d15d899fb2c552b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pN!3HD)L&YSWoH@npA`j*mtA18G&-|P5oh++^8{>pbum2zJmfo~|T)4C4 zW%XO(@I`DBRtgJ8Vh*c8+~TDD%QOCc z|NKmL#@>zln4WFUO|KGn3iAJX!v6jJJzL&}usa>NTxEOxx82I+HBaV$zb*%IUgx?< zhDV{NK5V@$diM1H7AdfpTtCB+^0z$liXw2aK!%hO9@XEg8B;_UW@a$Na$M}s4wk>W z?8}t?KlL?N7>u|YdYBZF84g5Q%ee0Sez;0?@4j_x6M))8KwflX{3E(;b?BEMzpB{U kj02zRFVdQ&MBb@0Fc(cLI3~& diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_dnt.png deleted file mode 100644 index 5ddd978cbb1eb2008a3cde0faf6fa4f70eace72e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482 zcmV<80UiE{P)W7Eh*~t*a|Bg)7Qr)M$p(RGf&<>CLDg)I&bE{Kc*Ama_78TGv%*M>g24e22t`G5PU1IQ=< zG75l<0f4Hi=4S!t+CEI?tL@&;KN=l)!O zQOM;OgTr^571h_2_wLDKRA_0CxODop7{i?6i;6FwmcC_7dBzm6#$%P&toZwTq#V-p z8s15X{@&B^tlmC9@BH@Z|2EExyZ-EHTDhlu=;kH!K25COU;l}HwEm` z?f=GL#MR)lMT%iVamk$2FTV=ro9h2(Gi~T$Qb?A6e{XTT&xG)kQ~bGpny+94`GnQs zn4jOH{?_9B%|+K;prSJ~7#3%V)$TO=dMVe-|L2MSx7~Ra7BigCU@&3>I`(a62FJqK z^-HE-zY4MqXf#N!VgI4jP}ljq-ukPz^IEKUePhp;L%+nEcky~jTBHGEiGjh>)z4*} HQ$iB}5G2cb diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_iron.png deleted file mode 100644 index 52c1584b5a7faef3ac5594c6bf52430dabbddac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pN!3HD)FpQXR3ak(*Ni4Ki}KiqGcH_eE-{=*bNc41I6{q@t z?komLRtL2z8>UOU>$@($3^CD%in%dP(5wdzXOUU22WQ%mvv4FO#tN3!2SRL diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_schrab.png deleted file mode 100644 index 5fc11f60a3bc055528dea229b227d3fb353c14f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pN!3HD)Z0&(J_rY|w?>kBPqGB5^d|(f;Gkn>_P(r_cWHyoF^VCxgK}_TF^c zORrz^GCY}+sJM6EJqCxKi#n6y;;+j&Jkx5pE%q_W^XvK5;p`K3awY6>i@cv7`1k#5 z=4-Ei$FJEPd!Vj<{r0u%tL;9`|5Bd6!HqMPV_n=YhfnsuGx!x2Gn}}=81a^={?JQ5 zJ6ZXk@ikW%Q$!eMvb8r?F07dL{zt`$|27_sS ogQ{X{Uo?Ebd~((FxXAx(TkdhaTHD*`1dJ61Pgg&ebxsLQ0JCbw1ONa4 diff --git a/src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png b/src/main/resources/assets/hbm/textures/entity/ufo_siege_silver.png deleted file mode 100644 index b35162465ca6b15ddb1a2d64cdb9ef9617fad4c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^2|%pN!3HD)tOF80}+@1@k=}Q9y6IBoL=5ArEAXVX_KX5oVXlzzMCktiG7K{0sHQ)8`E5$ z-Ib_o^H{v`po=rd|4pNsPDn89u;t%n`+DNM zczuQh3AUCAAjW|xX_-m$;;+j&Jkx6^bxjJr^r!A~7Q@Wl40+dATzGFf>;K<9D_{S5 z*uC|A_2q4Eo8Rs2e`P5DGyk`EXz1Ef28YOLo>gbu|J}B`#e718!RVkVcSpG9F%w_U z&!6@$0=uQFP^R4Q*6HUN|FRe)SsmOMCwTr7y2t%99_Vb44u(D751!t-(R;h0?K9>7 z`SPX>JxmIV8G!EHa7|Br(P0Cf*Hgdz*(C+i2@U{B)(_zo+;^gZ9*LLwP_?t=+0yiD b`x!PoxxC%xpWG^7OfY!5`njxgN@xNAniIdp diff --git a/src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png b/src/main/resources/assets/hbm/textures/items/item_secret.aberrator.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8901a93a0ac80b7c95c4c0b36c968dc8b827a2 GIT binary patch literal 602 zcmV-g0;T9!$ZPsDNhXuECMhN1aG3r5{aStW(TL;>Y66LPT!uoSQxPc%^qI;!!OwD;g@pyep%AL-lVhWg`BgaJ!N?%ZzE;`p_mfJc+#{d$AQFklo=!hw z;}humJXA{HfMI7@TFbFvX4tkJQ6~_O$K^@#)sx@c=s8rSa5rwba_mx6L;@LR0(q+i#-60w1Ros2BQ(L?VB`1L+s&%S-6#436Un33Bzr z3fqMW%UhN>{J12$y7w?m({%^62_|2@7RQwX9H;uup5`XLZRHV7RZ4o>7OUwDwrw~3 o7cNAjQK=}3R1~G|{{Jg}1B(6KB0W}}@Bjb+07*qoM6N<$g4G-nzyJUM literal 0 HcmV?d00001 From 9028ca87b0e3ab0cc87dca51a7249ea1c2bd227d Mon Sep 17 00:00:00 2001 From: Voxelstice Date: Thu, 27 Mar 2025 18:43:21 +0300 Subject: [PATCH 29/32] Segmentation fault (core dumped) makes the xenon bar on fuel rods work in the RBMK console --- src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java index 7867f1bc2..542ddb96b 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java +++ b/src/main/java/com/hbm/inventory/gui/GUIRBMKConsole.java @@ -366,6 +366,10 @@ public class GUIRBMKConsole extends GuiScreen { int fe = (int)Math.ceil((col.data.getDouble("enrichment")) * 8); if(fe > 8) fe = 8; drawTexturedModalRect(guiLeft + x + 4, guiTop + y + size - fe - 1, 14, 191 - fe, 2, fe); + + int fx = (int)Math.ceil((col.data.getDouble("xenon")) * 8 / 100); + if(fx > 8) fx = 8; + drawTexturedModalRect(guiLeft + x + 7, guiTop + y + size - fx - 1, 17, 191 - fx, 2, fx); } break; From f177c8899a18c24528be78fa3f03fe67f6551c54 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 27 Mar 2025 22:12:19 +0100 Subject: [PATCH 30/32] i feel so shrigma --- changelog | 3 +- src/main/java/com/hbm/items/ModItems.java | 18 + .../java/com/hbm/items/armor/ArmorTaurun.java | 34 + .../weapon/sedna/factory/Orchestras.java | 2 +- .../java/com/hbm/main/ResourceManager.java | 5 + .../item/weapon/sedna/ItemRenderMAS36.java | 2 +- .../hbm/render/model/ModelArmorTaurun.java | 60 + .../render/model/ModelArmorTrenchmaster.java | 4 + .../com/hbm/util/DamageResistanceHandler.java | 6 + .../assets/hbm/models/armor/taurun.obj | 1871 +++++++++++++++++ .../assets/hbm/textures/armor/taurun_arm.png | Bin 0 -> 731 bytes .../hbm/textures/armor/taurun_chest.png | Bin 0 -> 4779 bytes .../hbm/textures/armor/taurun_helmet.png | Bin 0 -> 2634 bytes .../assets/hbm/textures/armor/taurun_leg.png | Bin 0 -> 957 bytes .../hbm/textures/items/taurun_boots.png | Bin 0 -> 163 bytes .../hbm/textures/items/taurun_helmet.png | Bin 0 -> 308 bytes .../assets/hbm/textures/items/taurun_legs.png | Bin 0 -> 211 bytes .../hbm/textures/items/taurun_plate.png | Bin 0 -> 287 bytes 18 files changed, 2002 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/hbm/items/armor/ArmorTaurun.java create mode 100644 src/main/java/com/hbm/render/model/ModelArmorTaurun.java create mode 100644 src/main/resources/assets/hbm/models/armor/taurun.obj create mode 100644 src/main/resources/assets/hbm/textures/armor/taurun_arm.png create mode 100644 src/main/resources/assets/hbm/textures/armor/taurun_chest.png create mode 100644 src/main/resources/assets/hbm/textures/armor/taurun_helmet.png create mode 100644 src/main/resources/assets/hbm/textures/armor/taurun_leg.png create mode 100644 src/main/resources/assets/hbm/textures/items/taurun_boots.png create mode 100644 src/main/resources/assets/hbm/textures/items/taurun_helmet.png create mode 100644 src/main/resources/assets/hbm/textures/items/taurun_legs.png create mode 100644 src/main/resources/assets/hbm/textures/items/taurun_plate.png diff --git a/changelog b/changelog index 46fa9943d..ad43bb799 100644 --- a/changelog +++ b/changelog @@ -10,4 +10,5 @@ ## Fixed * Fixed taint destroying bedrock -* Fixed ferrouranium plate not being castable \ No newline at end of file +* Fixed ferrouranium plate not being castable +* Fixed bayonet not rendering properly in third person \ No newline at end of file diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index a7bf99f5f..38e67f3ea 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1855,6 +1855,10 @@ public class ModItems { public static Item dns_plate; public static Item dns_legs; public static Item dns_boots; + public static Item taurun_helmet; + public static Item taurun_plate; + public static Item taurun_legs; + public static Item taurun_boots; public static Item trenchmaster_helmet; public static Item trenchmaster_plate; public static Item trenchmaster_legs; @@ -4478,6 +4482,16 @@ public class ModItems { dns_legs = new ArmorDNT(aMatDNS, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png", 1000000000, 1000000, 100000, 115).cloneStats((ArmorFSB) dns_helmet).setUnlocalizedName("dns_legs").setTextureName(RefStrings.MODID + ":dns_legs"); dns_boots = new ArmorDNT(aMatDNS, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png", 1000000000, 1000000, 100000, 115).cloneStats((ArmorFSB) dns_helmet).setUnlocalizedName("dns_boots").setTextureName(RefStrings.MODID + ":dns_boots"); + ArmorMaterial aMatTaurun = EnumHelper.addArmorMaterial("HBM_TRENCH", 150, new int[] { 3, 8, 6, 3 }, 100); + aMatTaurun.customCraftingMaterial = ModItems.plate_iron; + taurun_helmet = new ArmorTaurun(aMatTaurun, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png") + .addEffect(new PotionEffect(Potion.damageBoost.id, 20, 0)) + .setStepSize(1) + .hides(EnumPlayerPart.HAT) + .setUnlocalizedName("taurun_helmet").setTextureName(RefStrings.MODID + ":taurun_helmet"); + taurun_plate = new ArmorTaurun(aMatTaurun, 1, RefStrings.MODID + ":textures/armor/starmetal_1.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_plate").setTextureName(RefStrings.MODID + ":taurun_plate"); + taurun_legs = new ArmorTaurun(aMatTaurun, 2, RefStrings.MODID + ":textures/armor/starmetal_2.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_legs").setTextureName(RefStrings.MODID + ":taurun_legs"); + taurun_boots = new ArmorTaurun(aMatTaurun, 3, RefStrings.MODID + ":textures/armor/starmetal_1.png").cloneStats((ArmorFSB) taurun_helmet).setUnlocalizedName("taurun_boots").setTextureName(RefStrings.MODID + ":taurun_boots"); ArmorMaterial aMatTrench = EnumHelper.addArmorMaterial("HBM_TRENCH", 150, new int[] { 3, 8, 6, 3 }, 100); aMatTrench.customCraftingMaterial = ModItems.plate_iron; trenchmaster_helmet = new ArmorTrenchmaster(aMatTrench, 0, RefStrings.MODID + ":textures/armor/starmetal_1.png") @@ -6996,6 +7010,10 @@ public class ModItems { GameRegistry.registerItem(dns_plate, dns_plate.getUnlocalizedName()); GameRegistry.registerItem(dns_legs, dns_legs.getUnlocalizedName()); GameRegistry.registerItem(dns_boots, dns_boots.getUnlocalizedName()); + GameRegistry.registerItem(taurun_helmet, taurun_helmet.getUnlocalizedName()); + GameRegistry.registerItem(taurun_plate, taurun_plate.getUnlocalizedName()); + GameRegistry.registerItem(taurun_legs, taurun_legs.getUnlocalizedName()); + GameRegistry.registerItem(taurun_boots, taurun_boots.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_helmet, trenchmaster_helmet.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_plate, trenchmaster_plate.getUnlocalizedName()); GameRegistry.registerItem(trenchmaster_legs, trenchmaster_legs.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorTaurun.java b/src/main/java/com/hbm/items/armor/ArmorTaurun.java new file mode 100644 index 000000000..d927935b4 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ArmorTaurun.java @@ -0,0 +1,34 @@ +package com.hbm.items.armor; + +import com.hbm.render.model.ModelArmorTaurun; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public class ArmorTaurun extends ArmorFSB { + + public ArmorTaurun(ArmorMaterial material, int slot, String texture) { + super(material, slot, texture); + this.setMaxDamage(0); + } + + @SideOnly(Side.CLIENT) + ModelArmorTaurun[] models; + + @Override + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { + + if(models == null) { + models = new ModelArmorTaurun[4]; + + for(int i = 0; i < 4; i++) + models[i] = new ModelArmorTaurun(i); + } + + return models[armorSlot]; + } +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java index 9658c3cf4..cceceed9e 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Orchestras.java @@ -1301,7 +1301,7 @@ public class Orchestras { if(timer == 1) { int cba = (stack.getItem() == ModItems.gun_aberrator_eott && ctx.configIndex == 0) ? -1 : 1; SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory); - if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D * cba, -0.05, 0.25, -0.05 * cba, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 10F, (float)entity.getRNG().nextGaussian() * 12.5F, casing.getName()); + if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.5, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D * cba, -0.05, 0.25, -0.05 * cba, 0.01, -10F + (float)entity.getRNG().nextGaussian() * 10F, (float)entity.getRNG().nextGaussian() * 12.5F, casing.getName()); } } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 51f55b29f..1b5e83629 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -903,6 +903,7 @@ public class ResourceManager { public static final IModelCustom armor_tail = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/tail_peep.obj")); public static final IModelCustom player_manly_af = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/armor/player_fem.obj")); public static final IModelCustom armor_envsuit = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/envsuit.obj")); + public static final IModelCustom armor_taurun = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/taurun.obj")); public static final IModelCustom armor_trenchmaster = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/armor/trenchmaster.obj")); ////Texture Items @@ -1054,6 +1055,10 @@ public class ResourceManager { public static final ResourceLocation rpa_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/rpa_chest.png"); public static final ResourceLocation rpa_arm = new ResourceLocation(RefStrings.MODID, "textures/armor/rpa_arm.png"); + public static final ResourceLocation taurun_helmet = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_helmet.png"); + public static final ResourceLocation taurun_leg = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_leg.png"); + public static final ResourceLocation taurun_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_chest.png"); + public static final ResourceLocation taurun_arm = new ResourceLocation(RefStrings.MODID, "textures/armor/taurun_arm.png"); public static final ResourceLocation trenchmaster_helmet = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_helmet.png"); public static final ResourceLocation trenchmaster_leg = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_leg.png"); public static final ResourceLocation trenchmaster_chest = new ResourceLocation(RefStrings.MODID, "textures/armor/trenchmaster_chest.png"); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java index b43620e10..7d2a59a56 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMAS36.java @@ -187,7 +187,7 @@ public class ItemRenderMAS36 extends ItemRenderWeaponBase { ResourceManager.mas36.renderPart("Stock"); ResourceManager.mas36.renderPart("Bolt"); if(isScoped(stack)) ResourceManager.mas36.renderPart("Scope"); - GL11.glTranslated(0, -1, -6); + if(type != ItemRenderType.EQUIPPED) GL11.glTranslated(0, -1, -6); if(hasBayonet(stack)) ResourceManager.mas36.renderPart("Bayonet"); GL11.glShadeModel(GL11.GL_FLAT); } diff --git a/src/main/java/com/hbm/render/model/ModelArmorTaurun.java b/src/main/java/com/hbm/render/model/ModelArmorTaurun.java new file mode 100644 index 000000000..282be3f7b --- /dev/null +++ b/src/main/java/com/hbm/render/model/ModelArmorTaurun.java @@ -0,0 +1,60 @@ +package com.hbm.render.model; + +import org.lwjgl.opengl.GL11; + +import com.hbm.main.ResourceManager; +import com.hbm.render.loader.ModelRendererObj; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; + +public class ModelArmorTaurun extends ModelArmorBase { + + public ModelArmorTaurun(int type) { + super(type); + + head = new ModelRendererObj(ResourceManager.armor_taurun, "Helmet"); + body = new ModelRendererObj(ResourceManager.armor_taurun, "Chest"); + leftArm = new ModelRendererObj(ResourceManager.armor_taurun, "LeftArm").setRotationPoint(-5.0F, 2.0F, 0.0F); + rightArm = new ModelRendererObj(ResourceManager.armor_taurun, "RightArm").setRotationPoint(5.0F, 2.0F, 0.0F); + leftLeg = new ModelRendererObj(ResourceManager.armor_taurun, "LeftLeg").setRotationPoint(1.9F, 12.0F, 0.0F); + rightLeg = new ModelRendererObj(ResourceManager.armor_taurun, "RightLeg").setRotationPoint(-1.9F, 12.0F, 0.0F); + leftFoot = new ModelRendererObj(ResourceManager.armor_taurun, "LeftBoot").setRotationPoint(1.9F, 12.0F, 0.0F); + rightFoot = new ModelRendererObj(ResourceManager.armor_taurun, "RightBoot").setRotationPoint(-1.9F, 12.0F, 0.0F); + } + + @Override + public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { + setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); + + GL11.glPushMatrix(); + + if(type == 0) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_helmet); + head.render(par7); + } + if(type == 1) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_chest); + body.render(par7); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_arm); + leftArm.render(par7); + rightArm.render(par7); + } + if(type == 2) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_leg); + GL11.glTranslated(-0.01, 0, 0); + leftLeg.render(par7); + GL11.glTranslated(0.02, 0, 0); + rightLeg.render(par7); + } + if(type == 3) { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.taurun_leg); + GL11.glTranslated(-0.01, 0, 0); + leftFoot.render(par7); + GL11.glTranslated(0.02, 0, 0); + rightFoot.render(par7); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java b/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java index 533190861..16fc1aa88 100644 --- a/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java +++ b/src/main/java/com/hbm/render/model/ModelArmorTrenchmaster.java @@ -62,12 +62,16 @@ public class ModelArmorTrenchmaster extends ModelArmorBase { } if(type == 2) { Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.trenchmaster_leg); + GL11.glTranslated(-0.01, 0, 0); leftLeg.render(par7); + GL11.glTranslated(0.02, 0, 0); rightLeg.render(par7); } if(type == 3) { Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.trenchmaster_leg); + GL11.glTranslated(-0.01, 0, 0); leftFoot.render(par7); + GL11.glTranslated(0.02, 0, 0); rightFoot.render(par7); } diff --git a/src/main/java/com/hbm/util/DamageResistanceHandler.java b/src/main/java/com/hbm/util/DamageResistanceHandler.java index 1075f264f..320dcf897 100644 --- a/src/main/java/com/hbm/util/DamageResistanceHandler.java +++ b/src/main/java/com/hbm/util/DamageResistanceHandler.java @@ -151,6 +151,12 @@ public class DamageResistanceHandler { registerSet(ModItems.dns_helmet, ModItems.dns_plate, ModItems.dns_legs, ModItems.dns_boots, new ResistanceStats() .addCategory(CATEGORY_EXPLOSION, 100F, 0.99F) .setOther(100F, 1F)); + registerSet(ModItems.taurun_helmet, ModItems.taurun_plate, ModItems.taurun_legs, ModItems.taurun_boots, new ResistanceStats() + .addCategory(CATEGORY_PROJECTILE, 2F, 0.15F) + .addCategory(CATEGORY_FIRE, 1F, 0.25F) + .addCategory(CATEGORY_EXPLOSION, 0F, 0.25F) + .addExact(DamageSource.fall.damageType, 4F, 0.5F) + .setOther(2F, 0.1F)); registerSet(ModItems.trenchmaster_helmet, ModItems.trenchmaster_plate, ModItems.trenchmaster_legs, ModItems.trenchmaster_boots, new ResistanceStats() .addCategory(CATEGORY_PROJECTILE, 5F, 0.5F) .addCategory(CATEGORY_FIRE, 5F, 0.5F) diff --git a/src/main/resources/assets/hbm/models/armor/taurun.obj b/src/main/resources/assets/hbm/models/armor/taurun.obj new file mode 100644 index 000000000..4590617e3 --- /dev/null +++ b/src/main/resources/assets/hbm/models/armor/taurun.obj @@ -0,0 +1,1871 @@ +# Blender v2.79 (sub 0) OBJ File: 'taurun_scaled.blend' +# www.blender.org +o RightBoot +v -4.625000 24.300001 2.625000 +v 0.625000 24.299999 2.625000 +v -4.625000 24.300001 -2.625000 +v 0.625000 24.299999 -2.625000 +v -3.575000 24.300001 -3.675000 +v -0.425000 24.299999 -3.675000 +v -3.575001 22.200003 -3.675000 +v -0.425001 22.200001 -3.675000 +v -3.575001 21.150002 -2.625000 +v -0.425001 21.150000 -2.625000 +v -4.625000 22.200003 -2.625000 +v 0.624999 22.200001 -2.625000 +v 0.099999 20.100000 -2.100000 +v -4.100001 20.100002 -2.100000 +v 0.099999 20.100000 2.100000 +v -4.100001 20.100002 2.100000 +v -4.625001 20.100002 2.625000 +v 0.624999 20.100000 2.625000 +v -4.625001 20.100002 -2.625000 +v 0.624999 20.100000 -2.625000 +vt 0.000000 0.222222 +vt 0.250000 0.000000 +vt 0.000000 -0.000000 +vt 0.300000 0.044444 +vt 0.500000 0.000000 +vt 0.250000 0.000000 +vt 0.450000 0.133333 +vt 0.450000 0.044444 +vt 0.300000 0.133333 +vt 0.450000 0.177778 +vt 0.525000 0.422222 +vt 0.750000 0.400000 +vt 0.500000 0.400000 +vt 0.500000 0.311111 +vt 0.275000 0.422222 +vt 0.250000 0.400000 +vt 0.500000 0.044444 +vt 0.500000 0.133333 +vt 0.250000 0.133333 +vt 0.250000 0.044444 +vt 0.300000 0.355556 +vt 0.300000 0.177778 +vt 0.775000 0.422222 +vt 1.000000 0.400000 +vt 0.025000 0.422222 +vt 0.000000 0.400000 +vt 0.250000 0.311111 +vt 0.750000 0.222222 +vt 1.000000 0.222222 +vt 0.250000 0.222222 +vt 0.725000 0.422222 +vt 0.500000 0.222222 +vt 0.475000 0.422222 +vt 0.450000 0.355556 +vt 0.975000 0.422222 +vt 0.225000 0.422222 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 -0.0000 -0.7071 +vn -0.5774 -0.5774 -0.5773 +vn 0.5773 -0.5773 -0.5774 +vn 1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +s off +f 2/1/1 3/2/1 1/3/1 +f 6/4/1 3/5/1 4/6/1 +f 6/4/2 7/7/2 5/8/2 +f 8/9/3 9/10/3 7/7/3 +f 14/11/4 17/12/4 19/13/4 +f 11/14/5 19/13/5 17/12/5 +f 13/15/4 19/13/4 20/16/4 +f 3/17/6 7/7/6 11/18/6 +f 12/19/7 6/4/7 4/20/7 +f 9/10/8 11/18/8 7/7/8 +f 20/16/2 19/13/2 10/21/2 +f 8/9/9 12/19/9 10/22/9 +f 16/23/4 18/24/4 17/12/4 +f 15/25/4 20/16/4 18/26/4 +f 18/26/10 12/27/10 2/1/10 +f 1/28/11 18/24/11 2/29/11 +f 2/1/1 4/30/1 3/2/1 +f 6/4/1 5/8/1 3/5/1 +f 6/4/2 8/9/2 7/7/2 +f 8/9/3 10/22/3 9/10/3 +f 14/11/4 16/31/4 17/12/4 +f 17/12/5 1/28/5 11/14/5 +f 1/28/5 3/32/5 11/14/5 +f 13/15/4 14/33/4 19/13/4 +f 3/17/6 5/8/6 7/7/6 +f 12/19/7 8/9/7 6/4/7 +f 19/13/2 11/14/2 9/34/2 +f 10/21/2 12/27/2 20/16/2 +f 19/13/2 9/34/2 10/21/2 +f 16/23/4 15/35/4 18/24/4 +f 15/25/4 13/36/4 20/16/4 +f 20/16/10 12/27/10 18/26/10 +f 12/27/10 4/30/10 2/1/10 +f 1/28/11 17/12/11 18/24/11 +o LeftBoot +v 4.625000 24.299997 2.625000 +v -0.625000 24.299999 2.625000 +v 4.625000 24.299997 -2.625000 +v -0.625000 24.299999 -2.625000 +v 3.575000 24.299997 -3.675000 +v 0.425000 24.299999 -3.675000 +v 3.574999 22.199999 -3.675000 +v 0.425000 22.200001 -3.675000 +v 3.574999 21.149998 -2.625000 +v 0.424999 21.150000 -2.625000 +v 4.625000 22.199999 -2.625000 +v -0.625001 22.200001 -2.625000 +v -0.100001 20.100000 -2.100000 +v 4.099999 20.099998 -2.100000 +v -0.100001 20.100000 2.100000 +v 4.099999 20.099998 2.100000 +v 4.624999 20.099998 2.625000 +v -0.625001 20.100000 2.625000 +v 4.624999 20.099998 -2.625000 +v -0.625001 20.100000 -2.625000 +vt 0.250000 0.000000 +vt 0.000000 0.222222 +vt 0.000000 -0.000000 +vt 0.250000 0.000000 +vt 0.450000 0.044444 +vt 0.300000 0.044444 +vt 0.300000 0.133333 +vt 0.450000 0.133333 +vt 0.300000 0.177778 +vt 0.750000 0.400000 +vt 0.525000 0.422222 +vt 0.500000 0.400000 +vt 0.500000 0.311111 +vt 0.275000 0.422222 +vt 0.250000 0.400000 +vt 0.500000 0.133333 +vt 0.500000 0.044444 +vt 0.250000 0.044444 +vt 0.250000 0.133333 +vt 0.450000 0.177778 +vt 0.450000 0.355556 +vt 1.000000 0.400000 +vt 0.775000 0.422222 +vt 0.025000 0.422222 +vt 0.000000 0.400000 +vt 0.250000 0.311111 +vt 0.750000 0.222222 +vt 1.000000 0.222222 +vt 0.250000 0.222222 +vt 0.500000 0.000000 +vt 0.725000 0.422222 +vt 0.500000 0.222222 +vt 0.475000 0.422222 +vt 0.300000 0.355556 +vt 0.975000 0.422222 +vt 0.225000 0.422222 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.5774 -0.5774 -0.5774 +vn -0.5773 -0.5773 -0.5774 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 1.0000 +s off +f 23/37/12 22/38/12 21/39/12 +f 24/40/12 25/41/12 26/42/12 +f 25/41/13 28/43/13 26/42/13 +f 27/44/14 30/45/14 28/43/14 +f 37/46/15 34/47/15 39/48/15 +f 37/46/16 39/48/16 31/49/16 +f 39/48/15 33/50/15 40/51/15 +f 31/52/17 25/41/17 23/53/17 +f 24/54/18 28/43/18 32/55/18 +f 29/56/19 27/44/19 31/52/19 +f 40/51/13 29/57/13 39/48/13 +f 28/43/20 30/45/20 32/55/20 +f 38/58/15 36/59/15 37/46/15 +f 40/51/15 35/60/15 38/61/15 +f 22/38/21 32/62/21 38/61/21 +f 38/58/22 21/63/22 22/64/22 +f 23/37/12 24/65/12 22/38/12 +f 24/40/12 23/66/12 25/41/12 +f 25/41/13 27/44/13 28/43/13 +f 27/44/14 29/56/14 30/45/14 +f 37/46/15 36/67/15 34/47/15 +f 23/68/16 21/63/16 31/49/16 +f 21/63/16 37/46/16 31/49/16 +f 39/48/15 34/69/15 33/50/15 +f 31/52/17 27/44/17 25/41/17 +f 24/54/18 26/42/18 28/43/18 +f 40/51/13 32/62/13 30/70/13 +f 29/57/13 31/49/13 39/48/13 +f 40/51/13 30/70/13 29/57/13 +f 38/58/15 35/71/15 36/59/15 +f 40/51/15 33/72/15 35/60/15 +f 24/65/21 32/62/21 22/38/21 +f 32/62/21 40/51/21 38/61/21 +f 38/58/22 37/46/22 21/63/22 +o RightArm +v -3.900008 -0.299998 2.100000 +v -3.900008 -0.299998 -2.100000 +v -8.100008 -0.299997 -2.100000 +v -8.100008 -0.299997 2.100000 +v -3.900005 9.150001 2.100000 +v -8.100005 9.150002 2.100000 +v -8.100005 9.150002 -2.100000 +v -3.900005 9.150001 -2.100000 +vt 0.250000 0.692308 +vt 0.000000 0.000000 +vt 0.000000 0.692308 +vt 0.500000 0.692308 +vt 0.250000 0.000000 +vt 1.000000 0.692308 +vt 0.750000 0.000000 +vt 0.750000 0.692308 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 1.000000 0.000000 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +s off +f 42/73/23 45/74/23 41/75/23 +f 43/76/24 48/77/24 42/73/24 +f 41/78/25 46/79/25 44/80/25 +f 44/80/26 47/81/26 43/76/26 +f 44/82/27 42/73/27 41/83/27 +f 42/73/23 48/77/23 45/74/23 +f 43/76/24 47/81/24 48/77/24 +f 41/78/25 45/84/25 46/79/25 +f 44/80/26 46/79/26 47/81/26 +f 44/82/27 43/76/27 42/73/27 +o RightLeg +v -4.100004 11.700002 2.100000 +v 0.099996 11.700001 2.100000 +v -4.100004 11.700002 -2.100000 +v 0.099996 11.700001 -2.100000 +v 0.099999 20.100000 -2.100000 +v -4.100001 20.100002 -2.100000 +v 0.099999 20.100000 2.100000 +v -4.100001 20.100002 2.100000 +vt 0.225000 0.955556 +vt 0.025000 0.777778 +vt 0.025000 0.955556 +vt 0.225000 0.422222 +vt 0.025000 0.422222 +vt 0.775000 0.422222 +vt 0.975000 0.777778 +vt 0.975000 0.422222 +vt 0.275000 0.777778 +vt 0.475000 0.422222 +vt 0.275000 0.422222 +vt 0.525000 0.777778 +vt 0.725000 0.422222 +vt 0.525000 0.422222 +vt 0.225000 0.777778 +vt 0.775000 0.777778 +vt 0.475000 0.777778 +vt 0.725000 0.777778 +vn -0.0000 -1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 51/85/28 50/86/28 49/87/28 +f 50/86/29 53/88/29 55/89/29 +f 56/90/30 50/91/30 55/92/30 +f 52/93/31 54/94/31 53/95/31 +f 51/96/32 56/97/32 54/98/32 +f 51/85/28 52/99/28 50/86/28 +f 50/86/29 52/99/29 53/88/29 +f 56/90/30 49/100/30 50/91/30 +f 52/93/31 51/101/31 54/94/31 +f 51/96/32 49/102/32 56/97/32 +o LeftLeg +v 4.099996 11.700000 2.100000 +v -0.100004 11.700001 2.100000 +v 4.099996 11.700000 -2.100000 +v -0.100004 11.700001 -2.100000 +v -0.100001 20.100000 -2.100000 +v 4.099999 20.099998 -2.100000 +v -0.100001 20.100000 2.100000 +v 4.099999 20.099998 2.100000 +vt 0.025000 0.777778 +vt 0.225000 0.955556 +vt 0.025000 0.955556 +vt 0.225000 0.422222 +vt 0.025000 0.422222 +vt 0.975000 0.422222 +vt 0.775000 0.777778 +vt 0.775000 0.422222 +vt 0.475000 0.422222 +vt 0.275000 0.777778 +vt 0.275000 0.422222 +vt 0.725000 0.422222 +vt 0.525000 0.777778 +vt 0.525000 0.422222 +vt 0.225000 0.777778 +vt 0.975000 0.777778 +vt 0.475000 0.777778 +vt 0.725000 0.777778 +vn -0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 -0.0000 0.0000 +s off +f 58/103/33 59/104/33 57/105/33 +f 61/106/34 58/103/34 63/107/34 +f 63/108/35 57/109/35 64/110/35 +f 62/111/36 60/112/36 61/113/36 +f 64/114/37 59/115/37 62/116/37 +f 58/103/33 60/117/33 59/104/33 +f 61/106/34 60/117/34 58/103/34 +f 63/108/35 58/118/35 57/109/35 +f 62/111/36 59/119/36 60/112/36 +f 64/114/37 57/120/37 59/115/37 +o LeftArm +v 3.899992 -0.300001 2.100000 +v 3.899992 -0.300001 -2.100000 +v 8.099993 -0.300002 -2.100000 +v 8.099993 -0.300002 2.100000 +v 3.899995 9.149999 2.100000 +v 8.099996 9.149997 2.100000 +v 8.099996 9.149997 -2.100000 +v 3.899995 9.149999 -2.100000 +vt 0.000000 0.000000 +vt 0.250000 0.692308 +vt 0.000000 0.692308 +vt 0.250000 0.000000 +vt 0.500000 0.692308 +vt 0.750000 0.000000 +vt 1.000000 0.692308 +vt 0.750000 0.692308 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 1.000000 0.000000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +s off +f 69/121/38 66/122/38 65/123/38 +f 72/124/39 67/125/39 66/122/39 +f 70/126/40 65/127/40 68/128/40 +f 71/129/41 68/128/41 67/125/41 +f 66/122/42 68/130/42 65/131/42 +f 69/121/38 72/124/38 66/122/38 +f 72/124/39 71/129/39 67/125/39 +f 70/126/40 69/132/40 65/127/40 +f 71/129/41 70/126/41 68/128/41 +f 66/122/42 67/125/42 68/130/42 +o Helmet +v 5.249990 -8.200003 -4.200000 +v 5.249990 -8.200003 4.200000 +v -4.200010 -8.200000 5.250000 +v 4.199989 -8.200002 5.250000 +v -4.200010 -8.200000 -5.250000 +v 4.199989 -8.200002 -5.250000 +v -5.250010 -8.199999 4.200000 +v -5.250010 -8.199999 -4.200000 +v 5.249990 -6.100002 -4.200000 +v 5.249990 -6.100002 4.200000 +v -4.200009 -6.099999 5.250000 +v 4.199990 -6.100002 5.250000 +v -4.200009 -6.099999 -5.250000 +v 4.199990 -6.100002 -5.250000 +v -5.250010 -6.099998 4.200000 +v -5.250010 -6.099998 -4.200000 +v 7.349990 -5.050002 -4.200000 +v 7.349990 -5.050002 4.200000 +v -4.200009 -5.049998 7.349999 +v 4.199991 -5.050001 7.349999 +v -4.200009 -5.049998 -7.349999 +v 4.199991 -5.050001 -7.349999 +v -7.350008 -5.049997 4.200000 +v -7.350008 -5.049997 -4.200000 +v -3.150011 -10.299998 3.150000 +v -3.150011 -10.299998 -3.150000 +v 3.149989 -10.300000 -3.150000 +v 3.149989 -10.300000 3.150000 +v 4.724989 -8.200003 -3.675000 +v 4.724989 -8.200003 3.675000 +v -3.675010 -8.200000 4.725000 +v 3.674989 -8.200002 4.725000 +v -3.675010 -8.200000 -4.725000 +v 3.674989 -8.200002 -4.725000 +v -4.725010 -8.199999 3.675000 +v -4.725010 -8.199999 -3.675000 +v 4.724992 0.199999 -3.675000 +v 4.724992 0.199999 3.675000 +v -3.675008 0.200002 4.725000 +v 3.674992 0.200000 4.725000 +v -3.675008 0.200002 -4.725000 +v 3.674992 0.200000 -4.725000 +v -4.725008 0.200002 3.675000 +v -4.725008 0.200002 -3.675000 +v -3.675007 1.250001 3.675000 +v -3.675007 1.250001 -3.675000 +v 3.674992 1.249999 -3.675000 +v 3.674992 1.249999 3.675000 +v 1.574991 -2.950001 -4.725000 +v -1.575009 -2.950000 -4.725000 +v 1.574992 0.200000 -4.725000 +v -1.575008 0.200001 -4.725000 +v 1.574992 0.200000 -5.775000 +v 1.574991 -1.900000 -5.775000 +v -1.575008 -1.899999 -5.775000 +v -1.575008 0.200001 -5.775000 +v -2.100010 -5.575000 -4.725000 +v -0.736019 -4.787500 -4.725000 +v -0.736019 -3.212499 -4.725000 +v -2.100008 -2.424999 -4.725000 +v -3.463999 -3.212498 -4.725000 +v -3.463999 -4.787499 -4.725000 +v 2.099990 -5.575001 -4.725000 +v 3.463980 -4.787501 -4.725000 +v 3.463981 -3.212501 -4.725000 +v 2.099991 -2.425000 -4.725000 +v 0.736001 -3.212500 -4.725000 +v 0.736001 -4.787501 -4.725000 +v 2.099990 -5.575001 -5.250000 +v 3.463980 -4.787501 -5.250000 +v 3.463981 -3.212501 -5.250000 +v 2.099991 -2.425000 -5.250000 +v 0.736001 -3.212500 -5.250000 +v 0.736001 -4.787501 -5.250000 +v -2.100010 -5.575000 -5.250000 +v -0.736019 -4.787500 -5.250000 +v -0.736019 -3.212499 -5.250000 +v -2.100008 -2.424999 -5.250000 +v -3.463999 -3.212498 -5.250000 +v -3.463999 -4.787499 -5.250000 +v 1.574993 1.377384 -5.467462 +v 1.049993 1.748615 -5.096232 +v -1.050007 1.748616 -5.096232 +v -1.575007 1.377385 -5.467462 +v 1.049992 -0.478770 -7.323617 +v 1.574992 -0.107537 -6.952385 +v -1.575008 -0.107536 -6.952385 +v -1.050008 -0.478769 -7.323617 +v 1.574993 1.377388 -8.437310 +v 1.049992 1.006157 -8.808541 +v 1.049993 3.233541 -6.581155 +v 1.574993 2.862312 -6.952386 +v -1.575007 2.862313 -6.952386 +v -1.050007 3.233542 -6.581155 +v -1.050007 1.006157 -8.808541 +v -1.575007 1.377388 -8.437310 +v 1.049992 -0.478770 -4.353768 +v 0.524992 -0.107536 -3.982538 +v -0.525008 -0.107536 -3.982538 +v -1.050008 -0.478769 -4.353768 +v 0.524992 -1.592463 -5.467462 +v 1.049992 -1.221232 -5.096231 +v -1.050008 -1.221231 -5.096231 +v -0.525008 -1.592462 -5.467462 +v 1.049992 0.263694 -6.581154 +v 0.524992 -0.107536 -6.952386 +v 0.524993 1.377384 -5.467462 +v 1.049992 1.006153 -5.838693 +v -1.050007 1.006153 -5.838693 +v -0.525007 1.377384 -5.467462 +v -0.525008 -0.107536 -6.952386 +v -1.050008 0.263695 -6.581154 +v 1.443740 -6.625000 -5.355000 +v -1.443760 -6.625000 -5.355000 +v 1.443739 -8.200001 -5.355000 +v -1.443760 -8.200001 -5.355000 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.280000 0.093023 +vt 0.600000 0.046512 +vt 0.600000 0.093023 +vt 0.720000 0.046512 +vt 0.640000 0.093023 +vt 0.640000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.046512 +vt 0.720000 0.046512 +vt 0.640000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.093023 +vt 0.640000 0.093023 +vt 0.720000 0.046512 +vt 0.720000 0.093023 +vt 0.640000 0.046512 +vt 0.760000 0.000000 +vt 0.600000 0.000000 +vt 0.720000 0.046512 +vt 0.280000 0.000000 +vt 0.600000 0.000000 +vt 0.280000 0.046512 +vt 0.600000 -0.000000 +vt 0.760000 0.000000 +vt 0.280000 0.046512 +vt 0.600000 -0.000000 +vt 0.760000 0.000000 +vt 0.280000 -0.000000 +vt 0.280000 0.046512 +vt 0.560000 0.162791 +vt 0.320000 0.302326 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.680000 0.162791 +vt 0.680000 0.162791 +vt 0.720000 0.093023 +vt 0.680000 0.162791 +vt 0.640000 0.093023 +vt 0.680000 0.162791 +vt 0.320000 0.372093 +vt 0.280000 0.186047 +vt 0.320000 0.186047 +vt -0.000000 0.372093 +vt 0.280000 0.372093 +vt 0.000000 0.744186 +vt 0.280000 0.558140 +vt 0.280000 0.744186 +vt 0.920000 0.558140 +vt 0.960000 0.744186 +vt 0.920000 0.744186 +vt 0.320000 0.558140 +vt 0.320000 0.744186 +vt 0.640000 0.744186 +vt 0.600000 0.744186 +vt 0.640000 0.558140 +vt -0.000000 -0.000000 +vt 0.280000 0.162791 +vt -0.000000 0.162791 +vt -0.000000 0.186047 +vt 0.920000 0.534884 +vt 0.940000 0.534884 +vt 0.960000 0.558140 +vt 0.000000 0.558140 +vt 0.280000 0.534884 +vt 0.300000 0.162791 +vt 0.320000 0.534884 +vt 0.600000 0.558140 +vt 0.300000 0.534884 +vt 0.620000 0.534884 +vt 0.040000 0.441860 +vt 0.160000 0.395349 +vt 0.160000 0.441860 +vt 0.160000 0.372093 +vt 0.040000 0.395349 +vt 0.040000 0.372093 +vt 0.040000 0.465116 +vt 0.160000 0.465116 +vt -0.000000 0.395349 +vt -0.000000 0.465116 +vt 0.200000 0.395349 +vt 0.280000 0.372093 +vt 0.320000 0.418605 +vt 0.280000 0.418605 +vt 0.400000 0.418605 +vt 0.440000 0.372093 +vt 0.440000 0.418605 +vt 0.220000 0.372093 +vt 0.260000 0.418605 +vt 0.220000 0.418605 +vt 0.660000 0.465116 +vt 0.740000 0.418605 +vt 0.740000 0.465116 +vt 0.440000 0.406977 +vt 0.440000 0.360465 +vt 0.460000 0.348837 +vt 0.360000 0.465116 +vt 0.440000 0.418605 +vt 0.440000 0.465116 +vt 0.460000 0.465116 +vt 0.540000 0.418605 +vt 0.540000 0.465116 +vt 0.560000 0.476744 +vt 0.800000 0.406977 +vt 0.740000 0.395349 +vt 0.800000 0.395349 +vt 0.920000 0.406977 +vt 0.860000 0.395349 +vt 0.920000 0.395349 +vt 0.680000 0.406977 +vt 0.620000 0.395349 +vt 0.680000 0.395349 +vt 0.860000 0.406977 +vt 0.620000 0.406977 +vt 0.560000 0.395349 +vt 0.740000 0.406977 +vt 0.770035 0.411685 +vt 0.829965 0.411685 +vt 0.859930 0.441860 +vt 0.620000 0.406977 +vt 0.560000 0.395349 +vt 0.620000 0.395349 +vt 0.740000 0.406977 +vt 0.680000 0.395349 +vt 0.740000 0.395349 +vt 0.800000 0.406977 +vt 0.800000 0.395349 +vt 0.920000 0.406977 +vt 0.860000 0.395349 +vt 0.920000 0.395349 +vt 0.680000 0.406977 +vt 0.860000 0.406977 +vt 0.770035 0.411685 +vt 0.829965 0.411685 +vt 0.859930 0.441860 +vt 0.460000 0.418605 +vt 0.560000 0.465116 +vt 0.560000 0.418605 +vt 0.640000 0.418605 +vt 0.640000 0.465116 +vt 0.340000 0.418605 +vt 0.360000 0.418605 +vt 0.200000 0.418605 +vt 0.200000 0.372093 +vt 0.380000 0.372093 +vt 0.380000 0.418605 +vt 0.340000 0.418605 +vt 0.320000 0.372093 +vt 0.340000 0.372093 +vt 1.000000 0.302326 +vt 0.560000 0.162791 +vt 1.000000 0.162791 +vt 0.280000 0.046512 +vt 0.760000 0.000000 +vt 0.280000 -0.000000 +vt 0.280000 -0.000000 +vt 0.560000 0.302326 +vt 0.320000 0.162791 +vt 0.560000 0.162791 +vt 0.320000 0.162791 +vt 0.280000 -0.000000 +vt 0.640000 0.534884 +vt 0.000000 0.534884 +vt 0.600000 0.534884 +vt 0.200000 0.465116 +vt 0.400000 0.372093 +vt 0.260000 0.372093 +vt 0.660000 0.418605 +vt 0.540000 0.348837 +vt 0.560000 0.360465 +vt 0.560000 0.406977 +vt 0.560000 0.523256 +vt 0.540000 0.534884 +vt 0.460000 0.534884 +vt 0.440000 0.523256 +vt 0.440000 0.476744 +vt 0.560000 0.406977 +vt 0.829965 0.472036 +vt 0.770035 0.472036 +vt 0.740070 0.441860 +vt 0.560000 0.406977 +vt 0.829965 0.472036 +vt 0.770035 0.472036 +vt 0.740070 0.441860 +vt 0.340000 0.465116 +vt 0.560000 0.302326 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn 0.7071 -0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.4082 -0.8165 -0.4082 +vn -0.4082 -0.8165 0.4082 +vn -0.0000 -0.8944 -0.4472 +vn 0.4472 -0.8944 0.0000 +vn 0.4082 -0.8165 0.4082 +vn -0.4472 -0.8944 0.0000 +vn 0.4082 -0.8165 -0.4082 +vn -0.0000 -0.8944 0.4472 +vn -0.0000 -1.0000 0.0000 +vn -0.0000 -0.7071 -0.7071 +vn 0.7071 -0.7071 0.0000 +vn -0.0000 -0.7071 0.7071 +vn -0.7071 -0.7071 0.0000 +vn -0.4851 -0.7276 0.4851 +vn -0.4851 -0.7276 -0.4851 +vn 0.4851 -0.7276 -0.4851 +vn 0.4851 -0.7276 0.4851 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.5774 0.5774 -0.5774 +vn 0.7071 0.7071 0.0000 +vn 0.5774 0.5774 -0.5774 +vn 0.0000 0.7071 0.7071 +vn 0.5774 0.5774 0.5774 +vn -0.5774 0.5774 0.5774 +vn -0.5000 -0.8660 0.0000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn -0.7071 -0.5000 -0.5000 +vn 0.7071 -0.5000 -0.5000 +vn 0.7071 0.5000 0.5000 +vn -0.7071 0.5000 0.5000 +s off +f 76/133/43 83/134/43 75/135/43 +f 77/136/44 86/137/44 78/138/44 +f 73/139/45 82/140/45 74/141/45 +f 79/142/46 88/143/46 80/144/46 +f 81/145/47 78/146/47 86/147/47 +f 76/148/48 82/149/48 84/150/48 +f 83/151/49 79/152/49 75/153/49 +f 80/154/50 85/155/50 77/156/50 +f 88/157/51 93/158/51 85/155/51 +f 91/159/52 87/160/52 83/151/52 +f 86/137/53 93/161/53 94/162/53 +f 81/163/54 90/164/54 82/140/54 +f 82/149/55 92/165/55 84/150/55 +f 87/166/56 96/167/56 88/143/56 +f 86/147/57 89/168/57 81/145/57 +f 92/169/58 83/134/58 84/170/58 +f 99/171/59 97/172/59 98/173/59 +f 99/171/60 77/136/60 78/138/60 +f 100/174/61 73/139/61 74/141/61 +f 75/135/62 100/175/62 76/133/62 +f 98/176/63 79/142/63 80/144/63 +f 79/152/64 97/177/64 75/153/64 +f 80/154/65 77/156/65 98/178/65 +f 73/179/66 99/180/66 78/146/66 +f 74/181/67 76/148/67 100/182/67 +f 101/183/47 114/184/47 109/185/47 +f 105/186/44 114/184/44 106/187/44 +f 101/188/45 110/189/45 102/190/45 +f 116/191/50 105/192/50 108/193/50 +f 102/190/48 112/194/48 104/195/48 +f 107/196/46 116/191/46 108/193/46 +f 112/194/43 103/197/43 104/195/43 +f 103/197/49 115/198/49 107/196/49 +f 117/199/68 119/200/68 118/201/68 +f 113/202/69 119/200/69 114/184/69 +f 115/198/70 118/203/70 116/191/70 +f 116/191/71 118/204/71 113/205/71 +f 109/206/72 120/207/72 110/189/72 +f 109/185/73 114/184/73 119/208/73 +f 120/209/74 111/210/74 112/194/74 +f 110/189/75 120/211/75 112/194/75 +f 115/198/76 111/210/76 117/212/76 +f 127/213/44 125/214/44 126/215/44 +f 123/216/68 128/217/68 124/218/68 +f 122/219/60 126/215/60 121/220/60 +f 124/221/46 127/213/46 122/222/46 +f 123/223/45 126/215/45 125/214/45 +f 183/224/60 173/225/60 176/226/60 +f 170/227/74 182/228/74 171/229/74 +f 181/230/46 175/231/46 172/232/46 +f 154/233/74 166/234/74 155/235/74 +f 168/236/69 165/237/69 166/238/69 +f 156/239/46 168/240/46 159/241/46 +f 160/242/60 162/243/60 157/244/60 +f 160/242/62 157/244/62 158/245/62 +f 146/246/77 135/247/77 140/248/77 +f 144/249/78 139/250/78 138/251/78 +f 142/252/45 137/253/45 136/254/45 +f 145/255/46 140/248/46 139/250/46 +f 143/256/79 138/257/79 137/253/79 +f 141/258/80 136/254/80 135/247/80 +f 145/259/44 144/260/44 143/261/44 +f 149/262/79 132/263/79 131/264/79 +f 147/265/80 130/266/80 129/267/80 +f 152/268/77 129/267/77 134/269/77 +f 150/270/78 133/271/78 132/272/78 +f 148/273/45 131/264/45 130/266/45 +f 151/274/46 134/269/46 133/271/46 +f 151/275/44 150/276/44 149/277/44 +f 159/241/81 167/278/81 160/242/81 +f 158/279/82 162/243/82 161/280/82 +f 164/281/83 154/233/83 153/282/83 +f 156/239/84 166/283/84 165/284/84 +f 153/282/45 161/280/45 164/281/45 +f 175/231/81 183/224/81 176/226/81 +f 181/230/84 171/285/84 182/286/84 +f 180/287/83 170/227/83 169/288/83 +f 174/289/82 178/290/82 177/291/82 +f 174/289/45 180/287/45 169/288/45 +f 187/292/44 186/293/44 185/294/44 +f 76/133/43 84/170/43 83/134/43 +f 77/136/44 85/295/44 86/137/44 +f 73/139/45 81/163/45 82/140/45 +f 79/142/46 87/166/46 88/143/46 +f 81/145/47 73/179/47 78/146/47 +f 76/148/48 74/181/48 82/149/48 +f 83/151/49 87/160/49 79/152/49 +f 80/154/50 88/157/50 85/155/50 +f 88/157/51 96/167/51 93/158/51 +f 91/159/52 95/296/52 87/160/52 +f 86/137/53 85/295/53 93/161/53 +f 81/163/54 89/297/54 90/164/54 +f 82/149/55 90/164/55 92/165/55 +f 87/166/56 95/298/56 96/167/56 +f 86/147/57 94/162/57 89/168/57 +f 92/169/58 91/159/58 83/134/58 +f 99/171/59 100/299/59 97/172/59 +f 99/171/60 98/173/60 77/136/60 +f 100/174/61 99/300/61 73/139/61 +f 75/135/62 97/301/62 100/175/62 +f 98/176/63 97/302/63 79/142/63 +f 101/183/47 106/187/47 114/184/47 +f 105/186/44 113/202/44 114/184/44 +f 101/188/45 109/206/45 110/189/45 +f 116/191/50 113/205/50 105/192/50 +f 102/190/48 110/189/48 112/194/48 +f 107/196/46 115/198/46 116/191/46 +f 112/194/43 111/210/43 103/197/43 +f 103/197/49 111/210/49 115/198/49 +f 117/199/68 120/303/68 119/200/68 +f 113/202/69 118/201/69 119/200/69 +f 115/198/70 117/304/70 118/203/70 +f 109/206/72 119/305/72 120/207/72 +f 120/209/74 117/306/74 111/210/74 +f 127/213/44 128/217/44 125/214/44 +f 123/216/68 125/214/68 128/217/68 +f 122/219/60 127/213/60 126/215/60 +f 124/221/46 128/217/46 127/213/46 +f 123/223/45 121/307/45 126/215/45 +f 183/224/60 178/290/60 173/225/60 +f 170/227/74 179/308/74 182/228/74 +f 181/230/46 184/309/46 175/231/46 +f 154/233/74 163/310/74 166/234/74 +f 166/238/69 163/311/69 162/243/69 +f 163/311/69 164/312/69 162/243/69 +f 164/312/69 161/313/69 162/243/69 +f 162/243/69 167/278/69 166/238/69 +f 167/278/69 168/236/69 166/238/69 +f 156/239/46 165/284/46 168/240/46 +f 160/242/60 167/278/60 162/243/60 +f 158/245/62 153/314/62 154/315/62 +f 154/315/62 155/316/62 158/245/62 +f 155/316/62 156/317/62 158/245/62 +f 156/317/62 159/318/62 158/245/62 +f 159/318/62 160/242/62 158/245/62 +f 146/246/77 141/258/77 135/247/77 +f 144/249/78 145/255/78 139/250/78 +f 142/252/45 143/256/45 137/253/45 +f 145/255/46 146/246/46 140/248/46 +f 143/256/79 144/319/79 138/257/79 +f 141/258/80 142/252/80 136/254/80 +f 143/261/44 142/320/44 145/259/44 +f 142/320/44 141/321/44 145/259/44 +f 141/321/44 146/322/44 145/259/44 +f 149/262/79 150/323/79 132/263/79 +f 147/265/80 148/273/80 130/266/80 +f 152/268/77 147/265/77 129/267/77 +f 150/270/78 151/274/78 133/271/78 +f 148/273/45 149/262/45 131/264/45 +f 151/274/46 152/268/46 134/269/46 +f 149/277/44 148/324/44 151/275/44 +f 148/324/44 147/325/44 151/275/44 +f 147/325/44 152/326/44 151/275/44 +f 159/241/81 168/240/81 167/278/81 +f 158/279/82 157/244/82 162/243/82 +f 164/281/83 163/310/83 154/233/83 +f 156/239/84 155/327/84 166/283/84 +f 153/282/45 158/279/45 161/280/45 +f 175/231/81 184/309/81 183/224/81 +f 181/230/84 172/232/84 171/285/84 +f 180/287/83 179/308/83 170/227/83 +f 174/289/82 173/225/82 178/290/82 +f 174/289/45 177/291/45 180/287/45 +f 187/292/44 188/328/44 186/293/44 +o Chest +v 4.199992 -0.300001 2.100000 +v 4.199992 -0.300001 -2.100000 +v -4.200007 -0.299998 -2.100000 +v -4.200007 -0.299998 2.100000 +v 4.199994 7.994998 -2.100000 +v -4.200005 7.995000 -2.100000 +v 4.199995 10.094998 -2.100000 +v -4.200004 10.095000 -2.100000 +v 4.199995 10.094998 -2.625000 +v 4.199994 7.994998 -2.625000 +v -4.200005 7.995000 -2.625000 +v -4.200004 10.095000 -2.625000 +v 4.199994 7.994998 2.100000 +v -4.200005 7.995000 2.100000 +v 4.199995 10.094998 2.100000 +v -4.200004 10.095000 2.100000 +v 4.199994 7.994998 2.625000 +v -4.200005 7.995000 2.625000 +v 4.199995 10.094998 2.625000 +v -4.200004 10.095000 2.625000 +v -4.725005 7.995000 -2.100000 +v -4.725004 10.095001 -2.100000 +v -4.725005 7.995000 2.100000 +v -4.725004 10.095001 2.100000 +v 4.724995 7.994998 -2.100000 +v 4.724996 10.094997 -2.100000 +v 4.724995 7.994998 2.100000 +v 4.724996 10.094997 2.100000 +v -4.200005 9.150001 2.100000 +v -4.200005 9.150001 -2.100000 +v 4.199995 9.149999 2.100000 +v 4.199995 9.149999 -2.100000 +v -4.200000 22.800001 5.250000 +v 4.200000 22.799997 5.250000 +v 5.249998 17.549997 2.100000 +v 5.249998 17.549997 -2.100000 +v -5.250002 17.550001 2.100000 +v -5.250002 17.550001 -2.100000 +v -0.000005 9.150000 -2.100000 +v -4.200002 15.450001 -3.150000 +v -2.100003 15.450001 -3.150000 +v 4.199997 15.449999 -3.150000 +v 2.099997 15.449999 -3.150000 +v 4.199996 12.299998 2.100000 +v 4.199996 12.299998 -2.100000 +v -4.200004 12.300000 -2.100000 +v -4.200004 12.300000 2.100000 +v 3.149995 11.249999 3.150000 +v -3.150004 11.250001 3.150000 +v 3.149992 0.749999 3.150000 +v -3.150007 0.750001 3.150000 +v 3.149992 0.749999 5.250000 +v -3.150007 0.750001 5.250000 +v 3.149993 2.849999 7.349999 +v 3.149995 11.249999 7.349999 +v -3.150004 11.250001 7.349999 +v -3.150007 2.850001 7.349999 +v 4.199993 4.949999 6.300000 +v 4.199995 10.199999 6.300000 +v 4.199995 10.199999 4.200000 +v 4.199993 4.949999 4.200000 +v 3.149995 11.249999 6.300000 +v 3.149993 4.950000 6.300000 +v 3.149995 11.249999 4.200000 +v 3.149993 4.950000 4.200000 +v 3.937494 4.949999 5.512500 +v 3.412494 4.950000 5.512500 +v 3.937494 4.949999 4.987500 +v 3.412494 4.950000 4.987500 +v 3.412493 3.899998 4.987500 +v 3.937493 3.899998 4.987500 +v 3.412493 3.899998 5.512500 +v 3.937493 3.899998 5.512500 +v 4.199993 3.899998 6.300000 +v 4.199993 3.899998 4.200000 +v 3.149993 3.899999 6.300000 +v 3.149993 3.899999 4.200000 +v 4.199992 1.799998 4.200000 +v 3.674992 1.799998 4.200000 +v 3.674992 1.799998 6.300000 +v 4.199992 1.799998 6.300000 +v 3.674993 3.899998 6.825000 +v 4.199993 3.899998 6.825000 +v 3.674993 2.849999 6.825000 +v 4.199993 2.849999 6.825000 +v 4.199993 3.899998 3.675000 +v 3.674993 3.899998 3.675000 +v 4.199993 2.849999 3.675000 +v 3.674993 2.849999 3.675000 +v -4.200006 4.950002 6.300000 +v -4.200004 10.200001 6.300000 +v -4.200004 10.200001 4.200000 +v -4.200006 4.950002 4.200000 +v -3.150006 4.950002 4.200000 +v -3.150004 11.250001 4.200000 +v -3.150006 4.950002 6.300000 +v -3.150004 11.250001 6.300000 +v -3.412506 4.950002 5.512500 +v -3.937506 4.950002 5.512500 +v -3.412506 4.950002 4.987500 +v -3.937506 4.950002 4.987500 +v -3.412507 1.800000 4.987500 +v -3.412507 1.800000 5.512500 +v -3.937507 1.800001 5.512500 +v -3.937507 1.800001 4.987500 +v -3.150007 2.325002 4.725000 +v -3.150007 2.325002 5.775000 +v -4.200006 2.325002 5.775000 +v -4.200006 2.325002 4.725000 +v -3.150007 3.900001 4.725000 +v -3.150007 3.900001 5.775000 +v -4.200006 3.900001 5.775000 +v -4.200006 3.900001 4.725000 +v -3.412507 2.587501 5.775000 +v -3.937507 2.587501 5.775000 +v -3.412507 3.637502 5.775000 +v -3.937506 3.637502 5.775000 +v -3.412507 3.112500 6.825000 +v -3.937507 3.112500 6.825000 +v -3.412507 3.637502 6.825000 +v -3.937506 3.637502 6.825000 +v -3.412507 3.637502 7.875000 +v -3.937506 3.637502 7.875000 +v -3.412506 4.162501 7.875000 +v -3.937506 4.162502 7.875000 +v -3.412507 2.587501 4.725000 +v -3.937507 2.587501 4.725000 +v -3.412507 3.637502 4.725000 +v -3.937506 3.637502 4.725000 +v -3.412507 3.112500 3.675000 +v -3.937507 3.112500 3.675000 +v -3.412507 3.637502 3.675000 +v -3.937506 3.637502 3.675000 +v -3.412507 3.637502 2.625000 +v -3.937506 3.637502 2.625000 +v -3.412506 4.162501 2.625000 +v -3.937506 4.162502 2.625000 +v 4.199993 0.749999 6.300000 +v -4.200007 0.750001 6.300000 +v 4.199993 2.234923 6.915076 +v -4.200006 2.234926 6.915076 +v 4.199994 2.849999 8.400000 +v -4.200006 2.850002 8.400000 +v 4.199993 2.234923 9.884923 +v -4.200006 2.234926 9.884923 +v 4.199993 0.749999 10.500000 +v -4.200006 0.750001 10.500000 +v 4.199991 -0.734926 9.884923 +v -4.200008 -0.734923 9.884923 +v 4.199991 -1.350000 8.400000 +v -4.200008 -1.349997 8.400000 +v 4.199991 -0.734926 6.915076 +v -4.200008 -0.734923 6.915076 +v 2.099995 10.199999 7.349999 +v -2.100004 10.200001 7.349999 +v 2.099994 6.000000 7.349999 +v -2.100006 6.000000 7.349999 +v 2.099994 6.000000 9.450000 +v 2.099995 10.199999 9.450000 +v -2.100004 10.200001 9.450000 +v -2.100006 6.000000 9.450000 +v 2.957832 11.899478 6.163495 +v 3.412495 11.874217 5.902212 +v 3.412496 11.899478 6.163495 +v 3.412495 8.764097 6.466626 +v 3.185164 11.912108 6.294134 +v 3.185163 8.776729 6.597267 +v 3.185164 11.937369 6.555416 +v 3.185163 8.801990 6.858547 +v 3.412496 11.950000 6.686055 +v 3.412495 8.814620 6.989188 +v 3.639827 11.937369 6.555416 +v 3.639826 8.801990 6.858547 +v 3.639827 11.912108 6.294134 +v 3.639826 8.776729 6.597267 +v 2.957832 11.950000 6.686055 +v 3.412495 11.975261 6.947338 +v 3.867158 11.950000 6.686055 +v 3.867158 11.899478 6.163495 +v 4.094491 12.931973 5.931808 +v 3.412496 12.894082 5.539885 +v 4.094491 13.007758 6.715653 +v 3.412496 13.045648 7.107575 +v 2.730501 13.007758 6.715653 +v 2.730501 12.931973 5.931808 +v 4.094491 13.977101 5.830763 +v 3.412496 13.939210 5.438842 +v 4.094491 14.052884 6.614610 +v 3.412496 14.090775 7.006532 +v 2.730501 14.052884 6.614610 +v 2.730501 13.977101 5.830763 +v 2.957832 12.447959 7.446981 +v 3.412496 12.491173 7.188064 +v 3.412496 12.447959 7.446981 +v 3.412495 9.340938 6.928412 +v 3.185164 12.426353 7.576441 +v 3.185163 9.319330 7.057871 +v 3.185164 12.383138 7.835360 +v 3.185163 9.276116 7.316791 +v 3.412496 12.361531 7.964818 +v 3.412495 9.254509 7.446248 +v 3.639827 12.383138 7.835360 +v 3.639826 9.276116 7.316791 +v 3.639827 12.426353 7.576441 +v 3.639826 9.319330 7.057871 +v 2.957832 12.361531 7.964818 +v 3.412496 12.318316 8.223737 +v 3.867159 12.361531 7.964818 +v 3.867159 12.447959 7.446981 +v 4.094491 13.505240 7.490378 +v 3.412496 13.570062 7.102001 +v 4.094491 13.375598 8.267134 +v 3.412496 13.310778 8.655512 +v 2.730501 13.375598 8.267134 +v 2.730501 13.505240 7.490378 +v 4.094491 14.540915 7.663234 +v 3.412496 14.605736 7.274856 +v 4.094491 14.411272 8.439990 +v 3.412496 14.346450 8.828368 +v 2.730502 14.411272 8.439990 +v 2.730502 14.540915 7.663234 +vt 0.333333 0.400000 +vt 0.481481 0.387500 +vt 0.481481 0.400000 +vt 0.240741 0.387500 +vt 0.092593 0.337500 +vt 0.240741 0.337500 +vt 0.240741 0.325000 +vt 0.092593 0.325000 +vt 0.092593 0.400000 +vt 0.240741 0.400000 +vt 0.092593 0.325000 +vt 0.166667 0.125000 +vt 0.166667 0.325000 +vt 0.203704 0.325000 +vt 0.351852 0.000000 +vt 0.351852 0.325000 +vt 0.481481 0.325000 +vt 0.333333 0.337500 +vt 0.333333 0.325000 +vt 0.481481 0.337500 +vt 0.333333 0.387500 +vt 0.009259 0.400000 +vt 0.083333 0.387500 +vt 0.083333 0.400000 +vt 0.083333 0.325000 +vt 0.009259 0.337500 +vt 0.009259 0.325000 +vt 0.250000 0.400000 +vt 0.324074 0.387500 +vt 0.324074 0.400000 +vt 0.324074 0.325000 +vt 0.250000 0.337500 +vt 0.250000 0.325000 +vt 0.324074 0.337500 +vt 0.083333 0.337500 +vt 0.092593 0.387500 +vt 0.083333 0.400000 +vt 0.083333 0.325000 +vt 0.000000 0.325000 +vt -0.000000 0.337500 +vt 0.009259 0.387500 +vt -0.000000 0.387500 +vt 0.000000 0.400000 +vt 0.324074 0.325000 +vt 0.324074 0.400000 +vt 0.240741 0.325000 +vt 0.250000 0.387500 +vt 0.240741 0.400000 +vt 0.388889 0.325000 +vt 0.462963 0.125000 +vt 0.462963 0.325000 +vt 0.203704 0.000000 +vt 0.388889 0.125000 +vt 0.481481 0.325000 +vt 0.518519 0.175000 +vt 0.555556 0.325000 +vt 0.074074 0.325000 +vt 0.037037 0.175000 +vt 0.074074 0.175000 +vt 0.481481 0.175000 +vt 0.092593 0.125000 +vt 0.296296 0.400000 +vt 0.444444 0.700000 +vt 0.296296 0.700000 +vt 0.222222 0.700000 +vt 0.074074 0.700000 +vt 0.222222 0.400000 +vt 0.000000 0.700000 +vt 0.074074 0.400000 +vt 0.222222 0.800000 +vt 0.555556 0.775000 +vt 0.444444 0.525000 +vt 0.555556 0.525000 +vt 0.629630 0.825000 +vt 0.740741 0.775000 +vt 0.740741 0.825000 +vt 0.740741 0.725000 +vt 0.814815 0.525000 +vt 0.814815 0.775000 +vt 0.740741 0.525000 +vt 0.629630 0.425000 +vt 0.740741 0.425000 +vt 0.629630 0.725000 +vt 0.629630 0.525000 +vt 0.629630 0.775000 +vt 0.592593 0.775000 +vt 0.537037 0.850000 +vt 0.500000 0.900000 +vt 0.500000 0.850000 +vt 0.555556 0.900000 +vt 0.546296 0.875000 +vt 0.555556 0.875000 +vt 0.500000 0.775000 +vt 0.500000 0.825000 +vt 0.490741 0.800000 +vt 0.018519 0.850000 +vt 0.055556 0.875000 +vt 0.018519 0.875000 +vt 0.453704 0.775000 +vt 0.444444 0.800000 +vt 0.444444 0.775000 +vt 0.018519 0.700000 +vt 0.055556 0.725000 +vt 0.018519 0.725000 +vt 0.462963 0.775000 +vt 0.453704 0.800000 +vt 0.074074 0.850000 +vt 0.074074 0.700000 +vt 0.472222 0.800000 +vt 0.462963 0.800000 +vt 0.537037 0.912500 +vt 0.500000 0.912500 +vt 0.481481 0.775000 +vt 0.472222 0.775000 +vt 0.000000 0.850000 +vt 0.000000 0.700000 +vt 0.055556 0.850000 +vt 0.537037 0.825000 +vt 0.537037 0.775000 +vt 0.555556 0.850000 +vt 0.546296 0.850000 +vt 0.546296 0.837500 +vt 0.537037 0.900000 +vt 0.546296 0.800000 +vt 0.546296 0.825000 +vt 0.490741 0.850000 +vt 0.481481 0.875000 +vt 0.481481 0.850000 +vt 0.481481 0.900000 +vt 0.490741 0.875000 +vt 0.490741 0.900000 +vt 0.490741 0.837500 +vt 0.055556 0.725000 +vt 0.018519 0.850000 +vt 0.018519 0.725000 +vt 0.611111 0.887500 +vt 0.629630 0.912500 +vt 0.611111 0.912500 +vt 0.000000 0.850000 +vt 0.000000 0.700000 +vt 0.074074 0.850000 +vt 0.055556 0.850000 +vt 0.055556 0.700000 +vt 0.018519 0.875000 +vt 0.564815 0.850000 +vt 0.574074 0.862500 +vt 0.564815 0.862500 +vt 0.583333 0.775000 +vt 0.574074 0.850000 +vt 0.574074 0.775000 +vt 0.564815 0.775000 +vt 0.555556 0.850000 +vt 0.555556 0.775000 +vt 0.592593 0.775000 +vt 0.583333 0.850000 +vt 0.629630 0.825000 +vt 0.611111 0.850000 +vt 0.611111 0.825000 +vt 0.629630 0.887500 +vt 0.648148 0.850000 +vt 0.666667 0.887500 +vt 0.648148 0.887500 +vt 0.592593 0.850000 +vt 0.592593 0.887500 +vt 0.666667 0.862500 +vt 0.675926 0.837500 +vt 0.675926 0.862500 +vt 0.666667 0.887500 +vt 0.675926 0.887500 +vt 0.694444 0.887500 +vt 0.703704 0.862500 +vt 0.703704 0.887500 +vt 0.685185 0.862500 +vt 0.694444 0.862500 +vt 0.685185 0.887500 +vt 0.675926 0.825000 +vt 0.685185 0.837500 +vt 0.703704 0.837500 +vt 0.694444 0.837500 +vt 0.694444 0.862500 +vt 0.685185 0.837500 +vt 0.694444 0.837500 +vt 0.694444 0.887500 +vt 0.685185 0.862500 +vt 0.703704 0.862500 +vt 0.703704 0.887500 +vt 0.666667 0.887500 +vt 0.675926 0.862500 +vt 0.675926 0.887500 +vt 0.685185 0.887500 +vt 0.675926 0.837500 +vt 0.685185 0.825000 +vt 0.703704 0.837500 +vt 0.666667 0.862500 +vt 0.814815 0.662500 +vt 0.962963 0.700000 +vt 0.814815 0.700000 +vt 0.962963 0.737500 +vt 0.814815 0.737500 +vt 0.962963 0.437500 +vt 0.814815 0.475000 +vt 0.814815 0.437500 +vt 0.962963 0.475000 +vt 0.814815 0.512500 +vt 0.962963 0.512500 +vt 0.814815 0.550000 +vt 0.962963 0.550000 +vt 0.814815 0.587500 +vt 0.937455 0.253064 +vt 0.962963 0.238801 +vt 0.962963 0.336199 +vt 0.962963 0.625000 +vt 0.814815 0.625000 +vt 0.962963 0.662500 +vt 0.937455 0.421935 +vt 0.937455 0.353064 +vt 0.988471 0.353064 +vt 0.814815 0.225000 +vt 0.740741 0.325000 +vt 0.740741 0.225000 +vt 0.740741 0.375000 +vt 0.814815 0.325000 +vt 0.814815 0.375000 +vt 0.814815 0.175000 +vt 0.740741 0.175000 +vt 0.851852 0.325000 +vt 0.851852 0.225000 +vt 0.703704 0.225000 +vt 0.703704 0.325000 +vt 0.425926 0.800000 +vt 0.435185 0.825000 +vt 0.425926 0.825000 +vt 0.398148 0.787500 +vt 0.388889 0.800000 +vt 0.388889 0.787500 +vt 0.398148 0.712500 +vt 0.407407 0.800000 +vt 0.416667 0.825000 +vt 0.407407 0.825000 +vt 0.425926 0.787500 +vt 0.435185 0.800000 +vt 0.407407 0.787500 +vt 0.444444 0.800000 +vt 0.435185 0.787500 +vt 0.407407 0.712500 +vt 0.416667 0.787500 +vt 0.398148 0.850000 +vt 0.398148 0.825000 +vt 0.416667 0.800000 +vt 0.416667 0.712500 +vt 0.397836 0.706250 +vt 0.391360 0.711298 +vt 0.391360 0.701202 +vt 0.388889 0.825000 +vt 0.435185 0.712500 +vt 0.398148 0.800000 +vt 0.444444 0.787500 +vt 0.390314 0.856394 +vt 0.398148 0.850287 +vt 0.405982 0.856394 +vt 0.416667 0.850000 +vt 0.444444 0.825000 +vt 0.435185 0.850000 +vt 0.388889 0.850000 +vt 0.407407 0.850000 +vt 0.425926 0.850000 +vt 0.425926 0.800000 +vt 0.435185 0.825000 +vt 0.425926 0.825000 +vt 0.398148 0.787500 +vt 0.388889 0.800000 +vt 0.388889 0.787500 +vt 0.388889 0.712500 +vt 0.407407 0.800000 +vt 0.416667 0.825000 +vt 0.407407 0.825000 +vt 0.435185 0.787500 +vt 0.425926 0.787500 +vt 0.407407 0.712500 +vt 0.407407 0.787500 +vt 0.444444 0.800000 +vt 0.435185 0.800000 +vt 0.444444 0.787500 +vt 0.416667 0.712500 +vt 0.416667 0.787500 +vt 0.398148 0.850000 +vt 0.398148 0.825000 +vt 0.416667 0.800000 +vt 0.389201 0.706250 +vt 0.391360 0.701202 +vt 0.397836 0.706250 +vt 0.398148 0.800000 +vt 0.388889 0.825000 +vt 0.425926 0.712500 +vt 0.435185 0.712500 +vt 0.393625 0.851924 +vt 0.402671 0.851924 +vt 0.402671 0.873076 +vt 0.416667 0.850000 +vt 0.444444 0.850000 +vt 0.435185 0.850000 +vt 0.388889 0.850000 +vt 0.407407 0.850000 +vt 0.425926 0.850000 +vt 0.490741 0.825000 +vt -0.000000 0.325000 +vt 0.444444 0.400000 +vt 0.000000 0.400000 +vt 0.074074 0.800000 +vt 0.444444 0.775000 +vt 0.777778 0.775000 +vt 0.546296 0.900000 +vt 0.055556 0.700000 +vt 0.481481 0.800000 +vt 0.074074 0.700000 +vt 0.018519 0.700000 +vt 0.055556 0.875000 +vt 0.592593 0.850000 +vt 0.629630 0.850000 +vt 0.666667 0.850000 +vt 0.666667 0.837500 +vt 0.685185 0.825000 +vt 0.675926 0.825000 +vt 0.666667 0.837500 +vt 0.962963 0.587500 +vt 0.988471 0.253064 +vt 0.999037 0.287500 +vt 0.988471 0.321936 +vt 0.937455 0.321936 +vt 0.926890 0.287500 +vt 0.926889 0.387500 +vt 0.962963 0.338801 +vt 0.999036 0.387500 +vt 0.988471 0.421936 +vt 0.962963 0.436199 +vt 0.388889 0.712500 +vt 0.425926 0.712500 +vt 0.395677 0.701202 +vt 0.395677 0.711298 +vt 0.389201 0.706250 +vt 0.444444 0.712500 +vt 0.405982 0.868606 +vt 0.398148 0.874712 +vt 0.390314 0.868606 +vt 0.444444 0.850000 +vt 0.398148 0.712500 +vt 0.444444 0.825000 +vt 0.395677 0.701202 +vt 0.395677 0.711298 +vt 0.391360 0.711298 +vt 0.444444 0.712500 +vt 0.407194 0.862500 +vt 0.393625 0.873076 +vt 0.389102 0.862500 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.9923 -0.1240 0.0000 +vn -0.0000 -0.2249 0.9744 +vn 0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.7071 0.0000 -0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.7071 -0.0000 0.7071 +vn 0.7071 -0.0000 -0.7071 +vn -0.9923 -0.1240 0.0000 +vn 0.8740 -0.1093 0.4734 +vn -0.8740 -0.1093 0.4734 +vn 0.0000 -0.1644 -0.9864 +vn -0.7960 -0.0995 -0.5970 +vn 0.7960 -0.0995 -0.5970 +vn -0.0000 -0.7071 0.7071 +vn 0.0000 -0.4472 0.8944 +vn -0.8729 -0.2182 -0.4364 +vn 0.7071 0.7071 0.0000 +vn -0.9701 -0.2425 0.0000 +vn 0.0000 -0.4472 -0.8944 +vn -0.7071 0.7071 0.0000 +vn 0.0000 -0.8944 0.4472 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 -0.8944 -0.4472 +vn 0.0000 0.8944 0.4472 +vn 0.0000 0.3827 -0.9239 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 0.3827 0.9239 +vn -0.0000 -0.3827 0.9239 +vn -0.0000 -0.9239 0.3827 +vn -0.0000 -0.9239 -0.3827 +vn -0.0000 -0.3827 -0.9239 +vn 0.9774 -0.2106 0.0204 +vn -0.0000 -0.9954 0.0962 +vn -0.5000 -0.0833 -0.8620 +vn -0.4887 -0.1292 0.8628 +vn 0.4887 -0.2921 -0.8221 +vn -0.5000 0.0833 0.8620 +vn 0.5000 0.0833 0.8620 +vn -0.4887 -0.2921 -0.8221 +vn 0.4887 -0.1292 0.8628 +vn 0.5000 -0.0833 -0.8620 +vn -0.9774 -0.2106 0.0204 +vn 0.0000 0.9954 -0.0962 +vn 0.9774 -0.2087 -0.0348 +vn -0.0000 -0.9864 -0.1646 +vn -0.5000 0.1426 -0.8542 +vn -0.4887 -0.3481 0.8000 +vn 0.4887 -0.0694 -0.8697 +vn -0.5000 -0.1426 0.8542 +vn 0.5000 -0.1426 0.8542 +vn -0.4887 -0.0694 -0.8697 +vn 0.4887 -0.3481 0.8000 +vn 0.5000 0.1426 -0.8542 +vn -0.9774 -0.2087 -0.0348 +vn 0.0000 0.9864 0.1646 +vn -0.8729 -0.2182 0.4364 +s off +f 201/329/85 206/330/85 202/331/85 +f 198/332/86 200/333/86 197/334/86 +f 195/335/87 200/333/87 196/336/87 +f 194/337/85 198/332/85 193/338/85 +f 220/339/88 223/340/88 219/341/88 +f 219/342/89 221/343/89 217/344/89 +f 204/345/87 207/346/87 203/347/87 +f 208/348/90 205/349/90 207/346/90 +f 202/350/85 209/351/85 194/352/85 +f 196/353/87 212/354/87 204/355/87 +f 193/356/85 215/357/85 201/358/85 +f 203/359/87 214/360/87 195/361/87 +f 215/357/91 214/360/91 216/362/91 +f 209/351/92 212/354/92 210/363/92 +f 209/351/93 200/333/93 199/364/93 +f 194/337/85 209/365/85 199/364/85 +f 196/336/87 200/333/87 210/366/87 +f 204/355/87 212/354/87 208/367/87 +f 208/368/94 211/369/94 206/370/94 +f 202/350/85 206/371/85 211/369/85 +f 203/347/87 207/346/87 216/372/87 +f 215/357/95 207/346/95 205/349/95 +f 201/329/85 215/373/85 205/349/85 +f 195/361/87 214/360/87 197/374/87 +f 197/334/96 213/375/96 198/332/96 +f 193/356/85 198/376/85 213/375/85 +f 217/377/97 226/378/97 218/379/97 +f 219/342/98 223/340/98 222/380/98 +f 217/344/99 221/343/99 225/381/99 +f 218/382/100 229/383/100 227/384/100 +f 220/385/100 231/386/100 230/387/100 +f 218/379/101 226/378/101 228/388/101 +f 220/339/102 230/387/102 224/389/102 +f 232/390/90 192/391/90 189/392/90 +f 190/393/91 232/390/91 189/392/91 +f 191/394/86 233/395/86 190/393/86 +f 192/396/92 234/397/92 191/394/92 +f 189/398/85 191/394/85 190/393/85 +f 238/399/86 237/400/86 236/401/86 +f 238/402/85 241/403/85 239/404/85 +f 245/405/92 237/406/92 239/407/92 +f 244/408/87 236/409/87 237/410/87 +f 244/408/90 242/411/90 243/412/90 +f 240/413/103 245/405/103 241/403/103 +f 242/411/91 240/414/91 238/399/91 +f 262/415/91 266/416/91 263/417/91 +f 268/418/104 273/419/104 272/420/104 +f 267/421/105 265/422/105 277/423/105 +f 249/424/85 251/425/85 253/426/85 +f 256/427/86 258/428/86 257/429/86 +f 252/430/106 247/431/106 248/432/106 +f 254/433/91 259/434/91 256/427/91 +f 251/435/90 247/431/90 250/436/90 +f 254/433/90 260/437/90 261/438/90 +f 266/416/85 268/439/85 267/440/85 +f 257/441/92 260/437/92 255/442/92 +f 248/432/86 253/443/86 252/444/86 +f 246/445/91 248/432/91 247/431/91 +f 264/446/87 263/417/87 265/422/87 +f 265/422/107 268/447/107 264/446/107 +f 270/448/90 273/419/90 271/449/90 +f 262/415/87 270/450/87 271/449/87 +f 262/415/91 273/419/91 269/451/91 +f 264/446/94 272/452/94 270/453/94 +f 274/454/86 277/455/86 275/456/86 +f 267/457/108 276/458/108 266/459/108 +f 263/417/87 275/460/87 265/422/87 +f 263/417/91 276/458/91 274/454/91 +f 280/461/92 278/462/92 279/463/92 +f 296/464/85 294/465/85 295/466/85 +f 279/463/90 284/467/90 285/468/90 +f 280/461/86 282/469/86 281/470/86 +f 279/463/109 283/471/109 280/461/109 +f 281/470/85 284/472/85 278/462/85 +f 292/473/85 290/474/85 291/475/85 +f 288/476/86 293/477/86 289/478/86 +f 287/479/90 291/480/90 286/481/90 +f 289/478/92 292/473/92 287/479/92 +f 286/482/91 290/483/91 288/476/91 +f 298/484/87 300/485/87 299/486/87 +f 300/485/92 297/487/92 296/464/92 +f 298/488/91 295/489/91 294/490/91 +f 297/487/86 298/488/86 294/490/86 +f 299/491/90 296/464/90 295/492/90 +f 308/493/91 310/494/91 306/495/91 +f 304/496/91 306/495/91 302/497/91 +f 305/498/87 308/499/87 304/500/87 +f 305/498/92 307/501/92 309/502/92 +f 302/497/110 307/501/110 303/503/110 +f 312/504/90 311/505/90 310/494/90 +f 309/502/111 312/506/111 308/499/111 +f 309/502/92 311/505/92 313/507/92 +f 306/495/110 311/505/110 307/501/110 +f 320/508/91 322/509/91 324/510/91 +f 316/511/91 318/512/91 320/508/91 +f 316/511/87 321/513/87 317/514/87 +f 317/515/92 319/516/92 315/517/92 +f 315/517/112 318/512/112 314/518/112 +f 323/519/86 324/520/86 322/509/86 +f 320/508/113 325/521/113 321/513/113 +f 321/522/92 323/519/92 319/516/92 +f 318/512/112 323/519/112 322/509/112 +f 326/523/114 329/524/114 328/525/114 +f 328/525/115 331/526/115 330/527/115 +f 331/528/116 332/529/116 330/530/116 +f 333/531/117 334/532/117 332/529/117 +f 335/533/118 336/534/118 334/532/118 +f 337/535/119 338/536/119 336/534/119 +f 333/537/92 331/538/92 339/539/92 +f 338/536/120 341/540/120 340/541/120 +f 340/541/121 327/542/121 326/523/121 +f 340/543/91 328/544/91 332/545/91 +f 348/546/90 346/547/90 347/548/90 +f 344/549/85 349/550/85 345/551/85 +f 343/552/87 347/548/87 342/553/87 +f 345/554/92 348/546/92 343/555/92 +f 342/556/91 346/547/91 344/557/91 +f 366/558/122 368/559/122 370/560/122 +f 354/561/123 351/562/123 352/563/123 +f 352/563/124 355/564/124 354/561/124 +f 364/565/125 371/566/125 372/567/125 +f 360/568/123 367/569/123 366/558/123 +f 355/564/92 356/570/92 354/561/92 +f 351/571/126 368/559/126 367/569/126 +f 362/572/123 351/571/123 367/569/123 +f 357/573/127 358/574/127 356/570/127 +f 372/567/92 379/575/92 373/576/92 +f 360/568/123 365/577/123 358/574/123 +f 359/578/128 360/568/128 358/574/128 +f 353/579/123 361/580/123 357/581/123 +f 351/562/129 373/576/129 369/582/129 +f 360/568/91 363/583/91 362/572/91 +f 366/558/130 371/566/130 365/577/130 +f 354/561/123 364/565/123 350/584/123 +f 363/583/131 352/585/131 362/572/131 +f 356/570/123 365/577/123 364/565/123 +f 364/565/132 373/576/132 350/584/132 +f 377/586/133 376/587/133 374/588/133 +f 370/560/128 377/589/128 371/566/128 +f 369/590/131 374/591/131 368/559/131 +f 369/582/124 379/575/124 375/592/124 +f 371/566/127 378/593/127 372/567/127 +f 370/560/91 374/591/91 376/594/91 +f 396/595/134 398/596/134 400/597/134 +f 384/598/135 381/599/135 382/600/135 +f 383/601/136 384/598/136 382/600/136 +f 394/602/137 401/603/137 402/604/137 +f 392/605/135 396/595/135 390/606/135 +f 384/598/92 387/607/92 386/608/92 +f 381/609/138 398/596/138 397/610/138 +f 382/611/135 397/610/135 392/605/135 +f 386/608/139 389/612/139 388/613/139 +f 402/604/92 409/614/92 403/615/92 +f 390/606/135 395/616/135 388/613/135 +f 389/612/140 390/606/140 388/613/140 +f 389/617/135 387/618/135 383/619/135 +f 380/620/141 399/621/141 381/599/141 +f 391/622/91 392/605/91 390/606/91 +f 395/616/142 400/597/142 401/603/142 +f 384/598/135 394/602/135 380/620/135 +f 393/623/143 382/611/143 392/605/143 +f 386/608/135 395/616/135 394/602/135 +f 380/620/144 402/604/144 403/615/144 +f 406/624/145 404/625/145 409/626/145 +f 400/597/140 407/627/140 401/603/140 +f 398/596/143 405/628/143 404/629/143 +f 399/621/136 409/614/136 405/630/136 +f 401/603/139 408/631/139 402/604/139 +f 398/596/91 406/632/91 400/597/91 +f 272/452/146 264/446/146 268/447/146 +f 277/423/93 265/422/93 275/633/93 +f 201/329/85 205/349/85 206/330/85 +f 198/332/86 199/364/86 200/333/86 +f 195/335/87 197/334/87 200/333/87 +f 194/337/85 199/364/85 198/332/85 +f 220/339/88 224/389/88 223/340/88 +f 219/342/89 222/380/89 221/343/89 +f 204/345/87 208/348/87 207/346/87 +f 208/348/90 206/330/90 205/349/90 +f 202/350/85 211/369/85 209/351/85 +f 196/353/87 210/363/87 212/354/87 +f 193/356/85 213/375/85 215/357/85 +f 203/359/87 216/362/87 214/360/87 +f 215/357/91 213/375/91 214/360/91 +f 209/351/92 211/369/92 212/354/92 +f 209/351/93 210/363/93 200/333/93 +f 208/368/94 212/354/94 211/369/94 +f 215/357/95 216/362/95 207/346/95 +f 197/334/96 214/360/96 213/375/96 +f 217/377/97 225/381/97 226/378/97 +f 218/382/100 228/388/100 229/383/100 +f 220/385/100 227/634/100 231/386/100 +f 232/390/90 235/635/90 192/391/90 +f 190/393/91 233/395/91 232/390/91 +f 191/394/86 234/397/86 233/395/86 +f 192/396/92 235/636/92 234/397/92 +f 189/398/85 192/637/85 191/394/85 +f 238/399/86 239/638/86 237/400/86 +f 238/402/85 240/413/85 241/403/85 +f 239/407/92 241/639/92 245/405/92 +f 245/405/92 244/408/92 237/406/92 +f 244/408/87 243/412/87 236/409/87 +f 244/408/90 245/405/90 242/411/90 +f 240/413/103 242/411/103 245/405/103 +f 238/399/91 236/401/91 242/411/91 +f 236/401/91 243/412/91 242/411/91 +f 262/415/91 269/451/91 266/416/91 +f 268/418/104 269/640/104 273/419/104 +f 249/424/85 246/445/85 251/425/85 +f 256/427/86 259/434/86 258/428/86 +f 252/430/106 250/641/106 247/431/106 +f 254/433/91 261/438/91 259/434/91 +f 251/435/90 246/445/90 247/431/90 +f 254/433/90 255/442/90 260/437/90 +f 266/416/85 269/451/85 268/439/85 +f 257/441/92 258/642/92 260/437/92 +f 248/432/86 249/424/86 253/443/86 +f 246/445/91 249/424/91 248/432/91 +f 264/446/87 262/415/87 263/417/87 +f 265/422/107 267/421/107 268/447/107 +f 270/448/90 272/420/90 273/419/90 +f 262/415/87 264/446/87 270/450/87 +f 262/415/91 271/449/91 273/419/91 +f 274/454/86 276/458/86 277/455/86 +f 267/457/108 277/455/108 276/458/108 +f 263/417/87 274/454/87 275/460/87 +f 263/417/91 266/416/91 276/458/91 +f 280/461/92 281/470/92 278/462/92 +f 296/464/85 297/487/85 294/465/85 +f 279/463/90 278/462/90 284/467/90 +f 280/461/86 283/643/86 282/469/86 +f 279/463/109 285/644/109 283/471/109 +f 281/470/85 282/645/85 284/472/85 +f 292/473/85 293/477/85 290/474/85 +f 288/476/86 290/483/86 293/477/86 +f 287/479/90 292/473/90 291/480/90 +f 289/478/92 293/477/92 292/473/92 +f 286/482/91 291/646/91 290/483/91 +f 298/484/87 301/647/87 300/485/87 +f 300/485/92 301/647/92 297/487/92 +f 298/488/91 299/648/91 295/489/91 +f 297/487/86 301/647/86 298/488/86 +f 299/491/90 300/485/90 296/464/90 +f 308/493/91 312/649/91 310/494/91 +f 304/496/91 308/493/91 306/495/91 +f 305/498/87 309/502/87 308/499/87 +f 305/498/92 303/503/92 307/501/92 +f 302/497/110 306/495/110 307/501/110 +f 312/504/90 313/650/90 311/505/90 +f 309/502/111 313/507/111 312/506/111 +f 309/502/92 307/501/92 311/505/92 +f 306/495/110 310/494/110 311/505/110 +f 320/508/91 318/512/91 322/509/91 +f 316/511/91 314/518/91 318/512/91 +f 316/511/87 320/508/87 321/513/87 +f 317/515/92 321/522/92 319/516/92 +f 315/517/112 319/516/112 318/512/112 +f 323/519/86 325/651/86 324/520/86 +f 320/508/113 324/510/113 325/521/113 +f 321/522/92 325/652/92 323/519/92 +f 318/512/112 319/516/112 323/519/112 +f 326/523/114 327/542/114 329/524/114 +f 328/525/115 329/524/115 331/526/115 +f 331/528/116 333/531/116 332/529/116 +f 333/531/117 335/533/117 334/532/117 +f 335/533/118 337/535/118 336/534/118 +f 337/535/119 339/653/119 338/536/119 +f 331/538/92 329/654/92 339/539/92 +f 329/654/92 327/655/92 339/539/92 +f 327/655/92 341/656/92 339/539/92 +f 339/539/92 337/657/92 335/658/92 +f 335/658/92 333/537/92 339/539/92 +f 338/536/120 339/653/120 341/540/120 +f 340/541/121 341/540/121 327/542/121 +f 340/543/91 326/659/91 328/544/91 +f 328/544/91 330/660/91 332/545/91 +f 332/545/91 334/661/91 336/662/91 +f 336/662/91 338/663/91 332/545/91 +f 338/663/91 340/543/91 332/545/91 +f 348/546/90 349/550/90 346/547/90 +f 344/549/85 346/547/85 349/550/85 +f 343/552/87 348/546/87 347/548/87 +f 345/554/92 349/550/92 348/546/92 +f 342/556/91 347/548/91 346/547/91 +f 366/558/122 367/569/122 368/559/122 +f 354/561/123 350/584/123 351/562/123 +f 352/563/124 353/664/124 355/564/124 +f 364/565/125 365/577/125 371/566/125 +f 360/568/123 362/572/123 367/569/123 +f 355/564/92 357/573/92 356/570/92 +f 351/571/126 369/590/126 368/559/126 +f 362/572/123 352/585/123 351/571/123 +f 357/573/127 359/578/127 358/574/127 +f 372/567/92 378/593/92 379/575/92 +f 360/568/123 366/558/123 365/577/123 +f 359/578/128 361/665/128 360/568/128 +f 357/581/123 355/666/123 353/579/123 +f 353/579/123 363/667/123 361/580/123 +f 361/580/123 359/668/123 357/581/123 +f 351/562/129 350/584/129 373/576/129 +f 360/568/91 361/665/91 363/583/91 +f 366/558/130 370/560/130 371/566/130 +f 354/561/123 356/570/123 364/565/123 +f 363/583/131 353/669/131 352/585/131 +f 356/570/123 358/574/123 365/577/123 +f 364/565/132 372/567/132 373/576/132 +f 374/588/133 375/670/133 377/586/133 +f 375/670/133 379/671/133 377/586/133 +f 379/671/133 378/672/133 377/586/133 +f 370/560/128 376/594/128 377/589/128 +f 369/590/131 375/673/131 374/591/131 +f 369/582/124 373/576/124 379/575/124 +f 371/566/127 377/589/127 378/593/127 +f 370/560/91 368/559/91 374/591/91 +f 396/595/134 397/610/134 398/596/134 +f 384/598/135 380/620/135 381/599/135 +f 383/601/136 385/674/136 384/598/136 +f 394/602/137 395/616/137 401/603/137 +f 392/605/135 397/610/135 396/595/135 +f 384/598/92 385/674/92 387/607/92 +f 381/609/138 399/675/138 398/596/138 +f 382/611/135 381/609/135 397/610/135 +f 386/608/139 387/607/139 389/612/139 +f 402/604/92 408/631/92 409/614/92 +f 390/606/135 396/595/135 395/616/135 +f 389/612/140 391/622/140 390/606/140 +f 387/618/135 385/676/135 383/619/135 +f 383/619/135 393/677/135 391/678/135 +f 391/678/135 389/617/135 383/619/135 +f 380/620/141 403/615/141 399/621/141 +f 391/622/91 393/623/91 392/605/91 +f 395/616/142 396/595/142 400/597/142 +f 384/598/135 386/608/135 394/602/135 +f 393/623/143 383/679/143 382/611/143 +f 386/608/135 388/613/135 395/616/135 +f 380/620/144 394/602/144 402/604/144 +f 404/625/145 405/680/145 409/626/145 +f 409/626/145 408/681/145 407/682/145 +f 407/682/145 406/624/145 409/626/145 +f 400/597/140 406/632/140 407/627/140 +f 398/596/143 399/675/143 405/628/143 +f 399/621/136 403/615/136 409/614/136 +f 401/603/139 407/627/139 408/631/139 +f 398/596/91 404/629/91 406/632/91 diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_arm.png b/src/main/resources/assets/hbm/textures/armor/taurun_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..121b5cae30e543d66773000bab9c3862dd960df5 GIT binary patch literal 731 zcmV<10wn#3P)`&Hal~r1g3IUNv%}^N zNM4m+?ygE2?(cbw*(9F5c%znYl~e$NAa`6`?EWnY*XvE0W##ceg6ltUAcz;bNFvuF zU=P3nzI^qzx)JqF0JNY7K?3gHX)^Vj5#J?nMC><5T~+)yP*2C{3za-p<5-;Oiv?)Tk`Mr_)9u5oS%u6nJtiqcs}2mpP#> z8guxhNy!j|O8%|pi-<;fsyv?7Jz2gJY8qzn>2Mfp*h?Yjl^KR1ZtH1x^XhF&A89xq z$BG}v>qYpq**xi(={c0e`e8`rD%HdTzj3&3AgP?m_)i}{V87qv>$mTV@vRJV0l|&1 zuD>@APN#(Rj0dsb?*RbAFf7LN`Ppmb5}C4;WVOET6?{+JR$_mL{{?qaKLP~>ulxW2 N002ovPDHLkV1oEHONIad literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_chest.png b/src/main/resources/assets/hbm/textures/armor/taurun_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..696b0e7a78812a9b3a10a6f2b06182cbcb8865b3 GIT binary patch literal 4779 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 FV1g#nLU#ZF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_helmet.png b/src/main/resources/assets/hbm/textures/armor/taurun_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..656f40f8ba21247216e596cdb6862a9ad738f374 GIT binary patch literal 2634 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/armor/taurun_leg.png b/src/main/resources/assets/hbm/textures/armor/taurun_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e595eeb30c4dce4637f743aa24d1a894733174 GIT binary patch literal 957 zcmV;u148_XP)b9w_{_3lr?ikq1p9ulLUw{9T-c$PV{TqD_oVVh5 zQf3EeaDWV5Z}iP_SJ(gmh9^VdGIYDd20#HE0@vVRm)HR88T@nk@(fB9`(}v>0MPw1 z?pECIRbFM?ez{G(jr-td>usEapRKoX6@Rwgp20nXdj|iP4Ekn?s_A6>NCxF3S?x*R zXoe0=manI`uDy5kzI+b;CkCsggTD1NS^i-RZgiUwuik|CjIBL3E5Uu+{d00NHR4>=!W6deZUy+;V4hsSyEF&>Y_FfSk?QEr+BF-DYSDPU7dXxmmc zBO=LJGgVbcCfB+nAn~U zH|LrjwPU)nIR~A!7Ij^V0#_!3T*bmFAtEdmi{3MbkE6rSPft%`TaTQp*4mdo$Q8?r zxj)}n1&p?(+AYt)<@L_=%-EI9-u>l~t!O5-9PcD+_behVtL{SttKR?HKJjQ4=!o|e}ilRWC=Qut- z-mIe55SmOTNi(SX5etX<=;#PlRSDDjtj_Zs&(F`ey}jLT4(b~Uv&JC#o$gHlP?jZt z*Va%~l{{}-1mKY94Y|to(Z|B;H)-hWiUH8uROg_+x$vk@02Y0YZ(E$T7R%)lS(f#{ zaDQyu79j-8=X07&CJ6u*i$(9Gh%w^v@evOX4_mKdIz2s2`q<%o)U0qG@`XZQnYjA7 f)!g6TZx!Uf?iUac;L5Oe|b`YcT4LXr|(O4zgqPnnR&~s6X>ge_r0oJ|Rj{Z*Tox%jwm zI=M`qsS*9N^m)=V(&d?Tbo_lDmdKI;Vst E05O?;-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/taurun_legs.png b/src/main/resources/assets/hbm/textures/items/taurun_legs.png new file mode 100644 index 0000000000000000000000000000000000000000..0be64f1d76b393f3518f2a64796df0dd58bf0399 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfwOK2Dmc%rlh0A`p(ym=vR|$Dq~!!$cb*F1o3?>5bMiW#rw6*5r-~gAjo^8E zPMqCkcYNj7R@*gND}>g|e0Ul6^SDG?J;B4{8TY(kfg0Z=-&K}^63NHo+?AcZQa znILis6bf|4IS3Tc@GJZL|G#hh;O}8%F&IV_K%S*$98D{!m!%~LLIBR`!T3C9Fc?Oa zkVFJHq25a^&r;L!;|Nj6Woc^(GzXw&pv8Uy-{hkKz%m}WZp(PoM0>n}-`&T%E7aaV z3zJ#@ Date: Fri, 28 Mar 2025 19:10:12 +1100 Subject: [PATCH 31/32] bonus: fix cascading worldgen lag on depth deposits --- .../com/hbm/world/feature/DepthDeposit.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/hbm/world/feature/DepthDeposit.java b/src/main/java/com/hbm/world/feature/DepthDeposit.java index f3ac76f35..3a99b6198 100644 --- a/src/main/java/com/hbm/world/feature/DepthDeposit.java +++ b/src/main/java/com/hbm/world/feature/DepthDeposit.java @@ -12,40 +12,40 @@ import net.minecraft.world.World; public class DepthDeposit { public static void generateConditionOverworld(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, Blocks.stone, ModBlocks.stone_depth); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, Blocks.stone, ModBlocks.stone_depth); } public static void generateConditionNether(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, Blocks.netherrack, ModBlocks.stone_depth_nether); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, Blocks.netherrack, ModBlocks.stone_depth_nether); } public static void generateCondition(World world, int x, int yMin, int yDev, int z, int size, double fill, Block block, Random rand, int chance, Block genTarget, Block filler) { - + if(rand.nextInt(chance) == 0) - generate(world, x + rand.nextInt(16), yMin + rand.nextInt(yDev), z + rand.nextInt(16), size, fill, block, rand, genTarget, filler); + generate(world, x + rand.nextInt(16) + 8, yMin + rand.nextInt(yDev), z + rand.nextInt(16) + 8, size, fill, block, rand, genTarget, filler); } public static void generate(World world, int x, int y, int z, int size, double fill, Block block, Random rand, Block genTarget, Block filler) { - + for(int i = x - size; i <= x + size; i++) { for(int j = y - size; j <= y + size; j++) { for(int k = z - size; k <= z + size; k++) { - + if(j < 1 || j > 126) continue; - + double len = Vec3.createVectorHelper(x - i, y - j, z - k).lengthVector(); Block target = world.getBlock(i, j, k); - + if(target.isReplaceableOreGen(world, i, j, k, genTarget) || target.isReplaceableOreGen(world, i, j, k, Blocks.bedrock)) { //yes you've heard right, bedrock - + if(len + rand.nextInt(2) < size * fill) { world.setBlock(i, j, k, block); - + } else if(len + rand.nextInt(2) <= size) { world.setBlock(i, j, k, filler); } From 6ae779cb236fc7b111d9e3e26a866461f59c2140 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 28 Mar 2025 14:34:31 +0100 Subject: [PATCH 32/32] it's not rocket science --- changelog | 5 +- .../java/com/hbm/entity/EntityMappings.java | 1 + .../hbm/entity/mob/EntityUndeadSoldier.java | 111 ++++++++++++++++++ src/main/java/com/hbm/main/ClientProxy.java | 1 + .../entity/mob/RenderUndeadSoldier.java | 39 ++++++ .../com/hbm/render/model/ModelArmorBase.java | 8 ++ .../com/hbm/render/model/ModelSkeletonNT.java | 29 +++++ 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java create mode 100644 src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java create mode 100644 src/main/java/com/hbm/render/model/ModelSkeletonNT.java diff --git a/changelog b/changelog index ad43bb799..0ba796cbe 100644 --- a/changelog +++ b/changelog @@ -7,8 +7,11 @@ * Reduced the AoE size of 7.62mm, .50 BMG and 10 gauge explosive projectiles * Removed the old gun mechanism items, turrets now use the new cast parts * A secret weapon and its variant have become craftable +* NEI now shows RBMK fuel rod recycling and cooling +* Removed most of the old unused siege mobs ## Fixed * Fixed taint destroying bedrock * Fixed ferrouranium plate not being castable -* Fixed bayonet not rendering properly in third person \ No newline at end of file +* Fixed bayonet not rendering properly in third person +* Fixed xenon poison gauge in the RBMK control panel not showing up on colums (oops) \ No newline at end of file diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 8a4cd26e1..b9e6bb10d 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -247,6 +247,7 @@ public class EntityMappings { addMob(EntityPlasticBag.class, "entity_plastic_bag", 0xd0d0d0, 0x808080); addMob(EntityParasiteMaggot.class, "entity_parasite_maggot", 0xd0d0d0, 0x808080); addMob(EntityDummy.class, "entity_ntm_test_dummy", 0xffffff, 0x000000); + addMob(EntityUndeadSoldier.class, "entity_ntm_undead_soldier", 0x749F30, 0x6C5B44); addSpawn(EntityCreeperPhosgene.class, 5, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); addSpawn(EntityCreeperVolatile.class, 10, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); diff --git a/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java new file mode 100644 index 000000000..c540dd03b --- /dev/null +++ b/src/main/java/com/hbm/entity/mob/EntityUndeadSoldier.java @@ -0,0 +1,111 @@ +package com.hbm.entity.mob; + +import com.hbm.items.ModItems; + +import net.minecraft.block.Block; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.IEntityLivingData; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class EntityUndeadSoldier extends EntityMob { + + public static final int DW_TYPE = 12; + public static final byte TYPE_ZOMBIE = 0; + public static final byte TYPE_SKELETON = 1; + + public EntityUndeadSoldier(World world) { + super(world); + this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(4, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(6, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); + this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityVillager.class, 0, true)); + } + + protected void entityInit() { + super.entityInit(); + this.getDataWatcher().addObject(DW_TYPE, Byte.valueOf((byte) 0)); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); + this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); + } + + @Override + protected boolean isAIEnabled() { + return true; + } + + @Override + public IEntityLivingData onSpawnWithEgg(IEntityLivingData data) { + this.addRandomArmor(); + this.dataWatcher.updateObject(DW_TYPE, rand.nextBoolean() ? TYPE_ZOMBIE : TYPE_SKELETON); + return super.onSpawnWithEgg(data); + } + + @Override + protected void addRandomArmor() { + this.setCurrentItemOrArmor(4, new ItemStack(ModItems.taurun_helmet)); + this.setCurrentItemOrArmor(3, new ItemStack(ModItems.taurun_plate)); + this.setCurrentItemOrArmor(2, new ItemStack(ModItems.taurun_legs)); + this.setCurrentItemOrArmor(1, new ItemStack(ModItems.taurun_boots)); + + this.setCurrentItemOrArmor(0, new ItemStack(ModItems.gun_heavy_revolver)); + } + + @Override + protected String getLivingSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.say"; + if(type == TYPE_SKELETON) return "mob.skeleton.say"; + return super.getLivingSound(); + } + + @Override + protected String getHurtSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.hurt"; + if(type == TYPE_SKELETON) return "mob.skeleton.hurt"; + return super.getHurtSound(); + } + + @Override + protected String getDeathSound() { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) return "mob.zombie.death"; + if(type == TYPE_SKELETON) return "mob.skeleton.death"; + return super.getDeathSound(); + } + + @Override + protected void func_145780_a(int x, int y, int z, Block blck) { + byte type = this.dataWatcher.getWatchableObjectByte(DW_TYPE); + if(type == TYPE_ZOMBIE) this.playSound("mob.zombie.step", 0.15F, 1.0F); + if(type == TYPE_SKELETON) this.playSound("mob.skeleton.step", 0.15F, 1.0F); + } + + @Override + public EnumCreatureAttribute getCreatureAttribute() { + return EnumCreatureAttribute.UNDEAD; + } + + @Override protected void dropFewItems(boolean player, int loot) { } + @Override protected void dropEquipment(boolean player, int loot) { } +} diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 03a11681f..6c0ac5d2a 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -758,6 +758,7 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityPlasticBag.class, new RenderPlasticBag()); RenderingRegistry.registerEntityRenderingHandler(EntityPigeon.class, new RenderPigeon(new ModelPigeon(), 0.3F)); RenderingRegistry.registerEntityRenderingHandler(EntityDummy.class, new RenderDummy()); + RenderingRegistry.registerEntityRenderingHandler(EntityUndeadSoldier.class, new RenderUndeadSoldier()); //"particles" RenderingRegistry.registerEntityRenderingHandler(EntityChlorineFX.class, new MultiCloudRenderer(new Item[] { ModItems.chlorine1, ModItems.chlorine2, ModItems.chlorine3, ModItems.chlorine4, ModItems.chlorine5, ModItems.chlorine6, ModItems.chlorine7, ModItems.chlorine8 })); RenderingRegistry.registerEntityRenderingHandler(EntityPinkCloudFX.class, new MultiCloudRenderer(new Item[] { ModItems.pc1, ModItems.pc2, ModItems.pc3, ModItems.pc4, ModItems.pc5, ModItems.pc6, ModItems.pc7, ModItems.pc8 })); diff --git a/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java b/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java new file mode 100644 index 000000000..7f43d82bc --- /dev/null +++ b/src/main/java/com/hbm/render/entity/mob/RenderUndeadSoldier.java @@ -0,0 +1,39 @@ +package com.hbm.render.entity.mob; + +import com.hbm.entity.mob.EntityUndeadSoldier; +import com.hbm.render.model.ModelSkeletonNT; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelZombie; +import net.minecraft.client.renderer.entity.RenderBiped; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; + +public class RenderUndeadSoldier extends RenderBiped { + + public static ResourceLocation textureZombie = new ResourceLocation("textures/entity/zombie/zombie.png"); + public static ResourceLocation textureSkeleton = new ResourceLocation("textures/entity/skeleton/skeleton.png"); + + public static ModelBiped modelZombie = new ModelZombie(); + public static ModelBiped modelSkeleton = new ModelSkeletonNT(); + + public RenderUndeadSoldier() { + super(modelZombie, 0.5F); + } + + @Override + protected void preRenderCallback(EntityLivingBase living, float interp) { + byte type = living.getDataWatcher().getWatchableObjectByte(EntityUndeadSoldier.DW_TYPE); + if(type == EntityUndeadSoldier.TYPE_ZOMBIE) this.mainModel = this.modelBipedMain = modelZombie; + if(type == EntityUndeadSoldier.TYPE_SKELETON) this.mainModel = this.modelBipedMain = modelSkeleton; + } + + @Override + protected ResourceLocation getEntityTexture(EntityLiving living) { + byte type = living.getDataWatcher().getWatchableObjectByte(EntityUndeadSoldier.DW_TYPE); + if(type == EntityUndeadSoldier.TYPE_ZOMBIE) return textureZombie; + if(type == EntityUndeadSoldier.TYPE_SKELETON) return textureSkeleton; + return null; + } +} diff --git a/src/main/java/com/hbm/render/model/ModelArmorBase.java b/src/main/java/com/hbm/render/model/ModelArmorBase.java index 99085fa94..be561bcaa 100644 --- a/src/main/java/com/hbm/render/model/ModelArmorBase.java +++ b/src/main/java/com/hbm/render/model/ModelArmorBase.java @@ -5,6 +5,7 @@ import com.hbm.render.loader.ModelRendererObj; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.entity.RenderBiped; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.Entity; @@ -174,6 +175,13 @@ public class ModelArmorBase extends ModelBiped { leftArm.copyRotationFrom(render.modelBipedMain.bipedLeftArm); rightArm.copyRotationFrom(render.modelBipedMain.bipedRightArm); } + } else { + Object o = RenderManager.instance.entityRenderMap.get(entity.getClass()); + if(o instanceof RenderBiped) { + RenderBiped render = (RenderBiped) o; + leftArm.copyRotationFrom(render.modelBipedMain.bipedLeftArm); + rightArm.copyRotationFrom(render.modelBipedMain.bipedRightArm); + } } } diff --git a/src/main/java/com/hbm/render/model/ModelSkeletonNT.java b/src/main/java/com/hbm/render/model/ModelSkeletonNT.java new file mode 100644 index 000000000..987519f54 --- /dev/null +++ b/src/main/java/com/hbm/render/model/ModelSkeletonNT.java @@ -0,0 +1,29 @@ +package com.hbm.render.model; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.model.ModelZombie; + +public class ModelSkeletonNT extends ModelZombie { + + public ModelSkeletonNT() { + this(0.0F); + } + + public ModelSkeletonNT(float scale) { + super(scale, 0.0F, 64, 32); + this.bipedRightArm = new ModelRenderer(this, 40, 16); + this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, scale); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); + this.bipedLeftArm = new ModelRenderer(this, 40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, scale); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, scale); + this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, scale); + this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); + } +}